1. 程式人生 > >實戰Asp.Net Core:部署應用

實戰Asp.Net Core:部署應用

images 應用部署 ali eps ati 推送 -s 文檔 edit

原文:實戰Asp.Net Core:部署應用

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 托管捆綁包,點此下載捆綁包
  2. 進行 IIS 控制臺,確保能在模塊中找到 AspNetCoreModule 托管模塊。(如果執行了步驟 1,未找到,可以嘗試控制臺執行 iisreset)
  3. 按照常規部署 .Net Framework 程序的方式,創建應用,在選擇應用程序池的時候,註意,一定要選擇無托管代碼,如圖:技術分享圖片
  4. 至此,就算部署成功了。

優勢:

  1. 學習成本低,和 .Net Framework 應用的部署方式保持類似。
  2. 能夠自動開機自啟。
  3. 可以在可視化界面中,配置端口域名綁定。

劣勢:

  1. 該方式僅能在 Windows 服務器上使用。
  2. 通過 IIS 橋接一層,有性能損失。

了解更多,請參考:IIS 部署.Net Core 應用

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

本文Github地址

實戰Asp.Net Core:部署應用