将 ASP.NET Core 应用部署到 App Engine

1. 概览

ASP.NET Core 是一个全新的开源跨平台框架,可用于使用 C# 编程语言构建基于云的现代互联应用。

在此实验中,您将一个简单的 ASP.NET Core 应用部署到 App Engine 柔性环境。此 Codelab 基于使用 Google Cloud Shell 构建并启动 ASP.NET Core 应用 Codelab 构建而成。您可能需要先完成该实验,然后再尝试此实验。

Google App Engine 应用易于创建、维护,并可根据流量和数据存储需求的变化轻松扩缩。使用 App Engine 时,无需管理任何服务器。您只需上传应用,就可以使用了。

App Engine 应用会根据传入的流量自动扩缩。App Engine 原生支持负载均衡、微服务、授权、SQL 和 NoSQL 数据库、Memcache、流量分配、日志记录、搜索、版本控制、发布和回滚以及安全扫描,所有这些功能都高度可自定义。

App Engine 的环境(标准环境柔性环境)支持多种编程语言,包括 C#、Java、Python、PHP、Node.js、Go 等。这两种环境各有优势,因此用户可以灵活地选择应用的行为方式。如需了解详情,请参阅选择 App Engine 环境

学习内容

  • 如何将简单的 ASP.NET Core 应用打包为 Docker 容器。
  • 如何将简单的 ASP.NET Core 应用部署到 App Engine。

所需条件

  • Google Cloud Platform 项目
  • 一个浏览器,例如 ChromeFirefox

您打算如何使用本教程?

仅阅读教程内容 阅读并完成练习

您如何评价自己在 Google Cloud Platform 方面的经验水平?

新手水平 中等水平 熟练水平

2. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

96a9c957bc475304.png

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串,您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud Console 会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此如果您不喜欢某个 ID,请再生成一个随机 ID,还可以尝试自己创建一个,并确认是否可用。然后,项目创建后,ID 会处于“冻结”状态。
  • 第三个值是一些 API 使用的项目编号。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud Console 中启用结算功能,才能使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。要关闭资源以避免产生超出本教程范围的费用,请按照此 Codelab 末尾提供的任何“清理”说明操作。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

激活 Cloud Shell

  1. 在 Cloud Console 中,点击激活 Cloud Shell4292cbf4971c9786.png

bce75f34b2c53987.png

如果您以前从未启动过 Cloud Shell,将看到一个中间屏幕(非首屏),描述它是什么。如果是这种情况,请点击继续(您将永远不会再看到它)。一次性屏幕如下所示:

70f315d7b402b476.png

预配和连接到 Cloud Shell 只需花几分钟时间。

fbe3a0674c982259.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。

在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:

  1. 在 Cloud Shell 中运行以下命令以确认您已通过身份验证:
gcloud auth list

命令输出

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. 在 Cloud Shell 中运行以下命令,以确认 gcloud 命令了解您的项目:
gcloud config list project

命令输出

[core]
project = <PROJECT_ID>

如果不是上述结果,您可以使用以下命令进行设置:

gcloud config set project <PROJECT_ID>

命令输出

Updated property [core/project].

3. 在 Cloud Shell 中创建 ASP.NET Core 应用

在 Cloud Shell 提示符下,您可以列出已安装的 .NET SDK,以验证 dotnet 命令行工具是否已安装:

dotnet --list-sdks

接下来,创建一个以 netcoreapp3.1 为目标框架的新 ASP.NET Core Web 应用:

dotnet new mvc -o HelloWorldAspNetCore -f netcoreapp3.1

系统会创建一个项目并恢复其依赖项。您应该会看到如下所示的消息:

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. 运行 ASP.NET Core 应用

我们的应用很快就可以运行了。前往应用文件夹。

cd HelloWorldAspNetCore

最后,运行应用。

dotnet run --urls=http://localhost:8080

该应用随即便开始监听端口 8080。

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

如要验证该应用是否正在运行,请点击右上角的网页预览按钮,然后选择“在端口 8080 上预览”。

Capture.PNG

您将看到默认的 ASP.NET Core 网页:

f579a9baedc108a9.png

验证应用正在运行后,按 Ctrl+C 关闭应用。

5. 发布 ASP.NET Core 应用

现在,使用 dotnet publish 命令发布该应用,这会得到一个可独立运行的 DLL。

dotnet publish -c Release

运行 publish 命令时,系统会显示一些消息,并在发布过程结束时显示已成功发布的 DLL。

...
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/HelloWorldAspNetCore.dll
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/HelloWorldAspNetCore.Views.dll
  HelloWorldAspNetCore -> /home/atameldev/HelloWorldAspNetCore/bin/Release/netcoreapp3.1/publish/

6. 为 App Engine 柔性环境创建 app.yaml

app.yaml 文件描述了如何将应用部署到 App Engine(在本例中为 App Engine 柔性环境)。

首先,前往 publish 文件夹。此文件应位于 bin/Release 文件夹下,但确切路径取决于 .NET 版本:

cd bin/Release/netcoreapp3.1/publish/

publish 文件夹中创建一个 app.yaml 文件:

cat <<EOT >> app.yaml
env: flex
runtime: aspnetcore
EOT

请注意,app.yaml 文件如何将环境指定为 flex,并将运行时指定为 aspnetcore

7. 部署到 App Engine 柔性环境

您可以使用 gcloud 将应用部署到 App Engine 柔性环境了。在 publish 目录中,运行以下命令:

gcloud app deploy --version v0

在部署期间,系统可能会要求您为应用选择区域。选择您希望应用在哪个区域中运行。

Please choose a region for your application. After choosing a region, 
you cannot change it. Which region would you like to choose?
 [1] europe-west   (supports standard and flexible)
 [2] us-central    (supports standard and flexible)
 [3] us-east1      (supports standard and flexible)
 [4] asia-northeast1 (supports standard and flexible)
 [5] cancel

此命令将在云端为您的应用创建映像,将该映像保存到 Google Container Registry 并部署到 App Engine。在部署期间,您实际上可以看到容器映像的构建过程:

Operation completed over 1 objects/571.8 KiB.
BUILD
Step #0: Pulling image: gcr.io/gcp-runtimes/aspnetcorebuild@sha256:d7b7975acb374fc3a9655a4e529993e6270cfa78023885684626528bc379f8eb
Step #0: sha256:d7b7975acb374fc3a9655a4e529993e6270cfa78023885684626528bc379f8eb: Pulling from gcp-runtimes/aspnetcorebuild

最后,您应该会看到应用已部署。

...
Deployed service [default] to [https://<project-id>.appspot.com]

部署应用后,在网络浏览器中打开网址 http://<project-id>.appspot.com 即可访问该应用。

您会在新标签页中看到默认的 ASP.NET Core 网页。

f579a9baedc108a9.png

您还可以查看在云端为您创建的容器映像。在 Cloud 控制台中,前往 Container Registry > 映像,然后在 appengine 文件夹中,您应该会看到应用的映像。

de788f4949d0c5a.png

8. 部署服务的新版本

在某些情况下,您部署到生产环境的应用将需要进行问题修复或需要其他功能。App Engine 可帮助您将新版本部署到生产环境,而不会影响您的用户。

首先,我们来修改应用。从 Cloud Shell 中打开代码编辑器。

868c4f615e2331fe.png

前往 HelloWorldAspNetCoreViews/Home 文件夹下的 Index.cshtml,并将默认消息更新为以下内容:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud Platform!

保存更改,然后返回到 Cloud Shell。在 HelloWorldAspNetCore, 中发布应用以获取独立的 DLL。

dotnet publish -c Release

导航到发布目录。

cd bin/Release/netcoreapp3.1/publish/

现在,您可以部署应用的新版本(在本例中为 v1)。

gcloud app deploy --version v1

部署完成后,您可以前往 Google Cloud 控制台的 App Engine 版本部分,查看应用的新版本是否正在处理所有流量并显示新消息。

8cc0cc992b4e07ed.png

9. 信息中心和流量拆分

在 App Engine 的“信息中心”部分下,您可以查看应用的多个信息中心,了解延迟时间、CPU 等信息。您可以自行探索这些信息中心。

5c879431935b080d.png

在“版本”部分下,您可以查看已部署的应用版本;在“流量拆分”部分中,您可以在不同版本之间拆分流量。我们来在两个版本之间拆分流量:

176a2e22e755b6d3.png

10. 恭喜!

清理

现在是时候关闭该应用了,这样可以节省费用,并践行良好的云资源管理实践。

前往 App Engine 的“版本”部分。

7e9b3b4406e785b9.png

选择相应版本并停止。

7f80d9ff2c959e0.png

停止版本后,支持实例将被删除,您应该会看到实例数量降至零。

29f3cb5c71225b2d.png

所学内容

好啦!您已创建 ASP.NET Core 应用,将其打包为 Docker 容器,并将其部署到 Google App Engine 柔性环境。

  • 如何将简单的 ASP.NET Core 应用打包为 Docker 容器。
  • 如何将简单的 ASP.NET Core 应用部署到 App Engine。

后续步骤

许可

此作品已获得 Creative Commons Attribution 2.0 通用许可授权。