1. 程式人生 > >開源:AspNetCore 應用程式熱更新升級工具(全網第一份公開的解決方案)

開源: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 開源的專案點個贊,謝謝。