實戰Asp.Net Core:部署應用

一、前言

某一刻,你已經把 .Net Core 的程序寫好了。接下來,還能夠作什麼呢?那就是部署了。linux

做爲一名開發工程師,若是不會部署本身開發的應用,那麼這也是不完整的。接下來,咱們就來講說,如何部署咱們的 .Net Core 應用程序(主要是 Asp.Net Core 應用)。git

二、Asp.Net Core 的部署方式

對於虛擬機中執行的語言來講,大都會有 SDK(Software Development Kit) 以及 XRE(X Runtime Environment)。對於 C#來講,也不例外。在 C#中,這二者的區別在於:github

  • .Net Core SDK 用於開發者構建 App,包含有較多開發相關的工具包(實際上,SDK 也是包含 Runtime)
  • .Net Core Runtime 僅做爲運行時使用,不包含開發工具包,體積較小。

既然要部署 Asp.Net Core,天然離不開 Runtime(若是裝 SDK 也能跑,不過不推薦在運行環境裝 SDK)。如下的部署方式的前提都是已經安裝 Runtime 環境。docker

下載地址:https://dotnet.microsoft.com/downloadwindows

2.一、控制檯直接運行

Asp.Net Core 程序在發佈後,會產生一個入口 dll 文件,要運行該程序,只須要經過 dotnet 命令執行該 dll 文件。因此,第一種方式就是直接找到 dll 文件,並使用 dotnet 命令來運行。(你說 dotnet 命令哪來的?安裝了 Runtime 就有了。)瀏覽器

# 進行控制檯執行
dotnet xxx.dll

優點:bash

  1. 足夠簡單,拷貝文件就開整。
  2. 兼容多平臺部署。

缺陷:服務器

  1. 想象一下,若是控制檯關掉了,服務器重啓了會怎樣?此時須要手動從新去從新執行。(你說,可不能夠設置爲開機啓動?若是建立一個批處理,放在啓動項中,仍是能作到的)

2.二、IIS 部署

用 .Net Framework 開發的應用,你們都比較熟悉用 IIS 來部署。那 .Net Core 呢?雖然二者的運行模式並不相同,但微軟爲了減小遷移難度,天然也提供了用 IIS 的部署方法。app

與 Asp.Net 不一樣,ASP.NET Core 再也不是由 IIS 工做進程(w3wp.exe)託管,而是使用自託管 Web 服務器(Kestrel)運行,IIS 則是做爲反向代理的角色轉發請求到 Kestrel 不一樣端口的 ASP.NET Core 程序中,隨後就將接收到的請求推送至中間件管道中去,處理完你的請求和相關業務邏輯以後再將 HTTP 響應數據從新回寫到 IIS 中,最終轉達到不一樣的客戶端(瀏覽器,APP,客戶端等)。asp.net

若是要使用 IIS 部署 Asp.Net Core 程序,步驟以下:

  1. 首先,須要安裝 .Net Core 託管捆綁包,點此下載捆綁包
  2. 進行 IIS 控制檯,確保能在模塊中找到 AspNetCoreModule 託管模塊。(若是執行了步驟 1,未找到,能夠嘗試控制檯執行 iisreset)
  3. 按照常規部署 .Net Framework 程序的方式,建立應用,在選擇應用程序池的時候,注意,必定要選擇無託管代碼,如圖:img
  4. 至此,就算部署成功了。

優點:

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

劣勢:

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

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

2.三、部署爲 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.四、Linux 部署

因爲 .Net Core 天生支持跨平臺,若是在廉價又穩定的 Linux 上部署 .Net Core 程序逐漸成爲主流。對於 Linux 上的部署,和 Windows 上並無什麼區別。首先是安裝 Runtime 環境,而後拷貝程序,並經過命令行運行。

再進一步,可使用後臺模式,讓程序在後臺運行。

更進一步,也能夠效仿 Windows,把程序啓動管理做爲一個服務,來達到開機啓動和靈活管理的目的。

2.五、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地址

相關文章
相關標籤/搜索