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