许多应用都需要在网络请求的具体情境之外进行后台处理。本教程创建了一个 Web 应用,让用户输入要翻译的文本,然后显示之前的翻译的列表。翻译在后台进程中完成,避免阻止用户的请求。
下图说明了翻译请求过程。
教程应用的工作原理的事件序列如下:
- 访问网页,查看存储在 Firestore 中的之前的翻译的列表。
- 通过输入 HTML 表单请求翻译文本。
- 翻译请求被发布到 Pub/Sub。
- 触发已订阅该 Pub/Sub 主题的 Cloud Run 服务。
- Cloud Run 服务使用 Cloud Translation 翻译文本。
- Cloud Run 服务将结果存储到 Firestore 中。
本教程适用于有兴趣了解如何使用 Google Cloud 进行后台处理的用户。无需任何有关 Pub/Sub、Firestore、App Engine 或 Cloud Functions 的先前经验。不过,具有一定程度的 .NET、JavaScript 和 HTML 相关经验会有助于您了解所有代码。
目标
- 了解并部署 Cloud Run 服务。
- 试用该应用。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
您可使用价格计算器根据您的预计使用情况来估算费用。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Run, Pub/Sub, and Cloud Translation APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Run, Pub/Sub, and Cloud Translation APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
更新
gcloud
组件:gcloud components update
- 准备开发环境。
准备应用
在终端窗口中,将示例应用代码库克隆到本地机器:
git clone https://github.com/GoogleCloudPlatform/getting-started-dotnet.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含后台任务示例代码的目录:
cd getting-started-dotnet/BackgroundProcessing
了解 TranslateWorker
服务
该服务首先导入多个依赖项,例如 Firestore 和 Translation。
系统初始化 Firestore 和 Translation 客户端,以便可以在各处理程序调用之间重复使用它们。这样,您便无需针对每次调用初始化新的客户端(此操作会降低执行速度)。
Translation API 会将字符串翻译为您选择的语言。
控制器的构造函数接收 Firestore 和 Pub/Sub 客户端。
Post
方法解析 Pub/Sub 消息以获取要翻译的文本。它使用消息 ID 作为翻译请求的唯一名称,以确保它不存储任何重复的翻译。
部署 TranslateWorker
服务
在
BackgroundProcessing
目录中,运行 PowerShell 脚本以构建服务并将其部署到 Cloud Run:PublishTo-CloudRun.ps1
了解 PublishTo-CloudRun.ps1
脚本
PublishTo-CloudRun.ps1
脚本将服务发布到 Cloud Run,并保护 TranslateWorker 服务不被滥用。如果该服务允许所有传入连接,则任何人都可以将翻译请求发布到控制器,从而产生成本。因此,您将服务设置为仅接受来自 Pub/Sub 的 POST
请求。
该脚本将执行以下操作:
- 使用
dotnet publish
在本地构建应用。 - 使用 Cloud Build 构建运行应用的容器。
- 将应用部署到 Cloud Run。
- 让项目能够创建 Pub/Sub 身份验证令牌。
- 创建一个服务帐号来表示 Pub/Sub 订阅身份。
- 授予服务帐号调用
TranslateWorker
服务的权限。 创建 Pub/Sub 主题和订阅。
了解 TranslateUI
服务
TranslateUI
服务将呈现一个显示最近翻译的网页,并接受新翻译请求。
StartUp
类将配置 ASP.NET 应用并创建 Pub/Sub 和 Firestore 客户端。索引处理程序
Index
从 Firestore 获取所有现有翻译,并用以下列表填充ViewModel
:通过提交 HTML 表单来请求新的翻译。请求翻译处理程序将验证请求,并将消息发布到 Pub/Sub:
部署 TranslateUI
服务
在
BackgroundProcessing
目录中,运行 PowerShell 脚本以构建服务并将其部署到 Cloud Run:./PublishTo-CloudRun.ps1
了解 PublishTo-CloudRun.ps1
脚本
PublishTo-CloudRun.ps1
脚本将应用发布到 Cloud Run。
该脚本将执行以下操作:
- 使用
dotnet publish
在本地构建应用。 - 使用 Cloud Build 构建运行应用的容器。
将应用部署到 Cloud Run。
测试应用
成功运行 PublishTo-CloudRun.ps1
脚本后,尝试请求翻译。
PublishTo-CloudRun.ps1
脚本中的最终命令告诉您 UI 服务的 网址。在您的终端窗口中,找到TranslateUI
服务的网址:gcloud beta run services describe translate-ui --region $region --format="get(status.address.hostname)"
在浏览器中,转到上一步获得的网址。
您将看到一个页面,其中包含一个空翻译列表和一个用于请求新翻译的表单。
在要翻译的文本 (Text to translate) 字段中,输入一些要翻译的文本,例如
Hello, World.
点击提交。
如需刷新页面,请点击刷新 refresh。翻译列表中有一个新行。如果您未看到翻译,请再等待几秒钟,然后重试。如果您仍未看到翻译,请参阅下一部分,了解如何调试应用。
调试应用
如果您无法连接到 Cloud Run 服务或看不到新的翻译,请检查以下内容:
检查
PublishTo-CloudRun.ps1
脚本是否已成功完成,并且未输出任何错误。如果有错误(如message=Build failed
),请修正这些错误,然后重试运行。查看日志以了解错误:
在 Google Cloud 控制台中,转到 Cloud Run 页面。
点击服务名称
translate-ui
。点击日志。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除 Google Cloud 项目
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
删除 Cloud Run 服务。
删除您在本教程中创建的 Cloud Run 服务:
gcloud beta run services delete --region=$region translate-ui
gcloud beta run services delete --region=$region translate-worker