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 方面的经验水平?
2. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



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

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

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

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证。只需使用一个浏览器或 Google Chromebook 即可完成本 Codelab 中的大部分(甚至全部)工作。
在连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID:
- 在 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`
- 在 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 上预览”。

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

验证应用正在运行后,按 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 网页。

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

8. 部署服务的新版本
在某些情况下,您部署到生产环境的应用将需要进行问题修复或需要其他功能。App Engine 可帮助您将新版本部署到生产环境,而不会影响您的用户。
首先,我们来修改应用。从 Cloud Shell 中打开代码编辑器。

前往 HelloWorldAspNetCore 的 Views/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 版本部分,查看应用的新版本是否正在处理所有流量并显示新消息。

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

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

10. 恭喜!
清理
现在是时候关闭该应用了,这样可以节省费用,并践行良好的云资源管理实践。
前往 App Engine 的“版本”部分。

选择相应版本并停止。

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

所学内容
好啦!您已创建 ASP.NET Core 应用,将其打包为 Docker 容器,并将其部署到 Google App Engine 柔性环境。
- 如何将简单的 ASP.NET Core 应用打包为 Docker 容器。
- 如何将简单的 ASP.NET Core 应用部署到 App Engine。
后续步骤
- 详细了解 Google Cloud Platform 上的 Windows。
- 详细了解 Google Cloud Platform 上的 .NET。
- 详细了解 Google Cloud Platform 上的 SQL Server。
- 详细了解 Cloud Tools for Visual Studio。
- 详细了解 Cloud Tools for PowerShell。
许可
此作品已获得 Creative Commons Attribution 2.0 通用许可授权。