1、前言
某一刻,你已經把 .Net Core 的程式寫好了。接下來,還可以做什麼呢?那就是部署了。
作為一名開發工程師,如果不會部署自己開發的應用,那麼這也是不完整的。接下來,我們就來說說,如何部署我們的 .Net Core 應用程式(主要是 Asp.Net Core 應用)。
2、Asp.Net Core 的部署方式
對於虛擬機器中執行的語言來說,大都會有 SDK(Software Development Kit) 以及 XRE(X Runtime Environment)。對於 C#來說,也不例外。在 C#中,這兩者的區別在於:
-
.Net Core SDK 用於開發者構建 App,包含有較多開發相關的工具包(實際上,SDK 也是包含 Runtime)
-
.Net Core Runtime 僅作為執行時使用,不包含開發工具包,體積較小。
既然要部署 Asp.Net Core,自然離不開 Runtime(如果裝 SDK 也能跑,不過不推薦在執行環境裝 SDK)。以下的部署方式的前提都是已經安裝 Runtime 環境。
下載地址:https://dotnet.microsoft.com/download
2.1、控制檯直接執行
Asp.Net Core 程式在釋出後,會產生一個入口 dll 檔案,要執行該程式,只需要透過 dotnet 命令執行該 dll 檔案。所以,第一種方式就是直接找到 dll 檔案,並使用 dotnet 命令來執行。(你說 dotnet 命令哪來的?安裝了 Runtime 就有了。)
# 進行控制檯執行
dotnet xxx.dll
優勢:
1、足夠簡單,複製檔案就開整。
2、相容多平臺部署。
缺陷:
1、想象一下,如果控制檯關掉了,伺服器重啟了會怎樣?此時需要手動重新去重新執行。(你說,可不可以設定為開機啟動?如果建立一個批處理,放在啟動項中,還是能做到的)
2.2、IIS 部署
用 .Net Framework 開發的應用,大家都比較熟悉用 IIS 來部署。那 .Net Core 呢?雖然兩者的執行樣式並不相同,但微軟為了減少遷移難度,自然也提供了用 IIS 的部署方法。
與 Asp.Net 不同,ASP.NET Core 不再是由 IIS 工作行程(w3wp.exe)託管,而是使用自託管 Web 伺服器(Kestrel)執行,IIS 則是作為反向代理的角色轉發請求到 Kestrel 不同埠的 ASP.NET Core 程式中,隨後就將接收到的請求推送至中介軟體管道中去,處理完你的請求和相關業務邏輯之後再將 HTTP 響應資料重新回寫到 IIS 中,最終轉達到不同的客戶端(瀏覽器,APP,客戶端等)。
如果要使用 IIS 部署 Asp.Net Core 程式,步驟如下:
1、首先,需要安裝 .Net Core 託管捆綁包,點此下載捆綁包https://dotnet.microsoft.com/download/thank-you/dotnet-runtime-2.2.1-windows-hosting-bundle-installer
2、進行 IIS 控制檯,確保能在模組中找到 AspNetCoreModule 託管模組。(如果執行了步驟 1,未找到,可以嘗試控制檯執行 iisreset)
3、按照常規部署 .Net Framework 程式的方式,建立應用,在選擇應用程式池的時候,註意,一定要選擇無託管程式碼,如圖:
4、至此,就算部署成功了。
優勢:
1、學習成本低,和 .Net Framework 應用的部署方式保持類似。
2、能夠自動開機自啟。
3、可以在視覺化介面中,配置埠域名系結。
劣勢:
1、該方式僅能在 Windows 伺服器上使用。
2、透過 IIS 橋接一層,有效能損失。
瞭解更多,請參考:IIS 部署.Net Core 應用
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2#install-the-net-core-hosting-bundle
2.3、部署為 Windows Service
在 2.2 的部署方式中,較大的缺陷就是效能損失。那麼,有沒有什麼辦法能夠可以避開這個問題呢?。答案就是 Windows Service,透過 Windows Service,我們能夠解決 2.1 中的開機啟動和持久執行問題,也能避開 2.2 中的效能損失。具體如何做呢?如下提供一種方式(當然,也可以用其他方式來部署 Windows Service):
1、藉助 nssm 來管理 Windows Service,Nssm,用法,請參考:https://nssm.cc/usage
2、配置 Service 開機啟動。
優勢:
1、高效能部署,穩定性好。
2、支援開機啟動。
劣勢:
1、僅能用於 Windows 伺服器。
2、引入了一個外包依賴 NSSM。
2.4、Linux 部署
由於 .Net Core 天生支援跨平臺,如果在廉價又穩定的 Linux 上部署 .Net Core 程式逐漸成為主流。對於 Linux 上的部署,和 Windows 上並沒有什麼區別。首先是安裝 Runtime 環境,然後複製程式,並透過命令列執行。
再進一步,可以使用後臺樣式,讓程式在後臺執行。
更進一步,也可以效仿 Windows,把程式啟動管理作為一個服務,來達到開機啟動和靈活管理的目的。
2.5、Docker 部署
作為當前個人認為的最棒的 .Net Core 應用部署方式,建議大家都瞭解下。
首先,是 Docker 的基本使用:
1、編寫 Dockerfile
2、使用 docker build 構建映象
3、使用 docker run 建立容器並執行
好,我們來依次說明,對於 Docker 來說,需要先安裝 Docker 環境。
接著,我們假設釋出包路徑如下:
root-folder/
app/ # 釋出包目錄
xxx.dll # 程式入口點
Dockerfile # Dockerfile檔案
然後針對該程式,編寫如下 Dockerfile:
# 根映象
FROM microsoft/dotnet:2.2-runtime
# 複製程式釋出包
COPY app /app
# 設定工作目錄
WORKDIR /app
# 匯出的埠
EXPOST 80
# 程式執行命令
CMD ["dotnet", "xxx.dll"]
接下來,透過在 root-folder 中執行 docker build -t xxx:0.0.1 . 來構建一個映象。
接著,再透過 docker run -it -p 8000:80 –name xxx-demo xxx:0.0.1 來建立並執行容器。
這樣,就可以透過 http://localhost:8000 來訪問到你的應用程式了。
此處只是大概寫下 Docker 部署的步驟,拋磚引玉。真正需要將其用於產線,還需要去學習下足夠的 Docker 知識。
額外提一下,如何選擇基礎映象
對於 .Net Core 來說,一般有如下幾類基礎映象:
-
sdk — 相信這個都比較容易理解,就是包含了 .Net Core SDK。
-
runtime — 這個也相對容易理解,包含了.Net Core Runtime。
-
runtime-deps –這個就不是很好理解, runtime? deps? 什麼意思呢?就是說,這個連 Runtime都不是全的,需要你在打包的時候,選擇自寄宿樣式,把Runtime也打進去。
綜上,我個人推薦大家選擇 runtime 這類作為基礎映象。
參考檔案
1、https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/?view=aspnetcore-2.2#install-the-net-core-hosting-bundle
2、https://hub.docker.com/r/microsoft/dotnet
3、https://docs.microsoft.com/en-us/dotnet/core/docker/building-net-docker-images?view=aspnetcore-2.2