实战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地址

相关文章
相关标签/搜索