开源:AspNetCore 应用程序热更新升级工具(全网第一份公开的解决方案)
1:下载、开源、使用教程
开源地址:https://github.com/cyq1162/AspNetCoreUpdater
使用教程:
解压AspNetCoreUpdater.rar,得到两个压缩包,分别对应用Window和Linux。

A、使用教程:For Window IIS
1、解压AspNetCoreUpdaterForWindow,得到一个执行文件和一个配置文件。

2、打开AspNetCoreUpdaterForWindow.ini,根据提示,修改对应的参数。

把对应要升级的dll或其它文件都放到update.zip包里,并移到发布目录下。
3、把软件移到发布的工具目录下,直接运行AspNetCoreUpdater.exe即可,运行过程如下图:

B、使用教程:For Linux Nginx
1、解压AspNetCoreUpdaterForLinux,得到一个dll和2个配置文件。

2、打开AspNetCoreUpdaterForLinux.ini,根据提示,修改对应的参数。

把对应要升级的dll或其它文件都放到update.zip包里,并移到发布目录下。
并将修改后的nginx.conf也放一份到update.zip包里。
3、把软件移到发布的工具目录下,命令cd到目录后,运行dotnet AspNetCoreUpdater.dll 即可,运行过程如下图:

2、AspNetCore热更新解决方案产出的过程
1、热更新定义:
当然是指更新dll等新应用程序后,启动新的程序接收新的请求,并保持原有的程序处理旧的请求,直到旧的请求处理完后,结束旧的应用程序的过程。
任何其它非以上解释的程序升级过程,都明显有点冷。
2、产出过程:
对于热更新,在AspNetCore之前,IIS一直处理的很好,以至于我们根本不需要思考这个问题。
直到我写了关于AspNetCore的文章开始后,关于Linux下如何进行热更新,开始有过简单的思考,不过不是实际应用,就没进一步。
直到最新的项目,建的AspNetCore应用程序, 并发布到本地IIS,在内网进行API测试时,一个基本的问题出现了:
我需要喊1声,大伙结束请求10秒钟,然后手工快速结束w3wp进程,然后点发布按钮。
开发过程,内部还能喊一声,但这样的升级明显是不科学,于是乎就上了一顿的搜索关于“NETCore 热更新”,结果,失望啊。
于是乎,我添加了一个.net framwork的解决方案,代码还是同一份,用不同的解决方案可以发布不同的版本。
PS:用过我框架的人都知道,开发方式和代码从来都是不需要改的,唯一的操作只要添加解决方案就可以在两种模式中切换。
部署也拆分成了两部分,只保持一些业务基本不动的,才用了dotnetcore部署。
这时候就一个念头产生了:DotNetCore如果热更新不解决,这必然会制约NetCore的大规模应用。
不是每个应用都能等到深夜再更新的;
也不是每个应用都允许随意中断用户请求的;
也不是每个程序员都有实力,能找到一种分布式的繁琐部署流程来解决升级的方法的。
就像我,搜了国内外的网,就以下几种不靠普的方案:
1、停机维护的:app_ffline.htm文件。
2、热更新配置文件:IOptionsSnapshot(只是.json文件)。
3、天真的动态加载dll想法:AppDomain走不通的。
4、就一句你去看:ApplicationPartManager的 。
发现没有好的解决方案之后,就只能分离一些不太重要,又更新不频繁的业务给了dotnetcore机会。
随着项目开发阶段忙碌加班的阶段过去之后,终于能分出点时间来研究并解决这个问题。
经过一番研究:AspNetCore源码、AppDomain源码、和Kestrel源码,打算从应用程序本身搞点事件,结果路走不通....
又经过一番研究...于是乎有了本文。
3、AspNetCore 热更新解决方案原理
对于AspNetCore应用程序来说,实现热更新的点,不在程序本身。
因此,无需要对AspNetCore本身做什么事件。
对于Window:
其核心在于 IIS,及IIS的应用程序池的回收机制,它能自动控制netcore程序的新旧更替。
因此,核心只要能控制IIS即可(涉及需要管理员权限)。
对于Linux:
其核心在于Ngnix(或其它),其重新加载配置的过程,和IIS应用程序池的回收有相似的原理,不过它只能控制自己的新旧更替。
因些会麻烦一些,但也能解决,需要自己通过代码控制dotnetcore项目的新启与消亡。
对于具体怎么交互与利用及其它细节,感兴趣的可以看开源的代码。
4、总结
本来只是打算自己用,后来想一想,这么基础的解决方案,还是开源了吧,反正我开源的项目没十个也有七八了,不在乎多这一个了。
嗯,如果您的相关项目正在使用或打算采用我的解决方案或升级工具,麻烦给 AspNetCoreUpdater 开源的项目点个赞,谢谢。
开源:AspNetCore 应用程序热更新升级工具(全网第一份公开的解决方案)的更多相关文章
- 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新
大家好, 我发起了一个 .Net Core 平台上的 开源项目 ShadowDomain 用于 热更新 . 简单的说, 原理就是 类似 Asp.net 那样 让 当前 WebApp 运行在一个 A ...
- Aspnetcore下面服务器热更新与配置热加载
原文:Aspnetcore下面服务器热更新与配置热加载 Asp.net的热更新方案Appdomain在aspnetcore中不被支持了 新的方案如下: 配置文件更新选项 reloadOnChange ...
- 微信小程序热更新,小程序提示版本更新,版本迭代,强制更新,微信小程序版本迭代
相信很多人在做小程序的时候都会有迭代每当版本迭代的时候之前老版本的一些方法或者显示就不够用了这就需要用到小程序的热更新.或者说是提示升级小程序版本 editionUpdate:function(){ ...
- cocos2d-js 在线更新代码脚本 动态更新脚本程序 热更新 绕过平台审核 不需重新上架
2014年8月15日补充 cocos2d-js 3.0 rc0 的AssetsManager有缺陷,有一些注意点:(可以阅读源代码发现) 1.旧manifest中有,但新manifest中没有的文件( ...
- 关于RN热更新-iOS端捕获加载jsbundle异常解决方案
1.监听加载jsbundle异常的处理 模拟情况:合并增量后jsbundle文件出现部分错误调试发现当加载jsbundle出现异常时,RN模块RCTBatchedBridge.m中如下代码会执行: - ...
- 项目升级,为了热更新使用lua。
现在发行商的要求越来越变态,必须要求程序热更新,以应对上线后的bug及时调整,我们目标锁定在 ulua, slua,(也对L#感兴趣过),一开始对 ulua 很困惑,unity 的 assetstor ...
- Unity3D 热更新方案(集合各位专家的汇总)
http://blog.csdn.net/guofeng526/article/details/52662994 热更新”这个词,在Unity3D的应用下,是有些语义错误的,但是作为大家都熟知的一项技 ...
- ReactNative 告别CodePush,自建热更新版本升级环境
微软的CodePush热更新非常难用大家都知道,速度跟被墙了没什么区别. 另外一方面,我们不希望把代码放到别人的服务器.自己写接口更新总归感觉安全一点. so,就来自己搞个React-Native A ...
- Lua------------------unity与lua的热更新
[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读 标签: 游戏开发游戏解决方案用户体验unity3d 2014-10-18 23:23 7680人阅读 ...
随机推荐
- Linux 批量创建user和批量删除用户
Linux 批量创建user和批量删除用户 以下为批量创建用户: #首先我们需要创建一个xxx.txt文件,把需要的我们创建的用户写在这个文本里面来,注意:每写完一个用户都需要换行. vim user ...
- AWT04-AWT常用组件
1.基本组件 方法名 说明 Button 按钮 Canvas 用于绘画的画布 Checkbox 复选框组件 CheckboxGroup 用于将多个Checkbox合成一组,一组Checkbox只有一个 ...
- Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet;
注意spark的Scala版本和java版本 修改后为官方指定的版本正常运行 Error:scalac: Error: object FloatRef does not have a member c ...
- vue第十单元(动态组件 keep-alive(钩子函数) 递归组件(name) 组件命名约定)
第十单元(动态组件 keep-alive(钩子函数) 递归组件(name) 组件命名约定) #课程目标 熟练掌握动态组件的实现 掌握keep-alive缓存组件,以及相应的钩子函数 熟练掌握递归组件, ...
- [日常摸鱼]poj2417 DiscreteLogging-BSGS算法
在这题TLE了一天-T_T BSGS裸题-不知道为什么一直挂 第二天(也就是今天)换成黄学长博客里的写法就过掉了 题意:解关于$x$的方程:$a^x \equiv b \pmod{p}$,$p$为质数 ...
- Spark的RPC
Spark 的 RPC 什么是RPC 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节 点间的Shuffle过程.Block数据的复制与备份等. ...
- <未解决的问题>crontab 定时弹框任务
问题:crontab写别的定时脚本就可以执行(比如说每隔一分钟就创建一个txt文件),但是写shell就不知道为什么,反弹不了 但是开启Linux终端窗口单独执行bash shell时候,(不通过re ...
- Unity 2017 Scene界面与Game界面显示不同/过于灰暗的解决办法
场景界面的显示过于灰暗,严重影响工作心情. 切换到游戏界面时的颜色. 只要将场景中全部摄像机的[Allow HDR]取消勾选即可.
- kaggle入门题Titanic
集成开发环境:Pycharm python版本:2.7(anaconda库) 用到的库:科学计算库numpy,数据分析包pandas,画图包matplotlib,机器学习库sklearn 大体步骤分为 ...
- 使用mybatis执行对应的SQL Mapper配置中的insert、update、delete等标签操作,数据库记录不变
我使用springMVC集成mybatis,执行SQLMapper配置文件里的insert操作,发现程序没有报错,但数据库表里却没有刚才插入的记录.查了很多资料,终于在一篇博客上找到了答案:在执行完方 ...