開源:AspNetCore 應用程序熱更新升級工具(全網第一份公開的解決方案)

1:下載、開源、使用教程

下載地址:Github 下載 、其它下載

開源地址: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 開源的項目點個贊,謝謝。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章