许多应用都需要在网络请求的具体情境之外进行后台处理。本教程创建了一个 Web 应用,让用户输入要翻译的文本,然后显示之前的翻译的列表。翻译在后台进程中完成,避免阻止用户的请求。
下图说明了翻译请求过程。
教程应用的工作原理的事件序列如下:
- 访问网页,查看存储在 Firestore 中的之前的翻译的列表。
- 通过输入 HTML 表单请求翻译文本。
- 翻译请求被发布到 Pub/Sub。
- 触发订阅了该 Pub/Sub 主题的 Cloud Run 函数。
- Cloud Run 函数使用 Cloud Translation 来翻译文本。
- Cloud Run 函数将结果存储在 Firestore 中。
本教程适用于有兴趣了解如何使用 Google Cloud 进行后台处理的用户。之前没有相关经验 Pub/Sub、Firestore、App Engine 或 Cloud Run 函数。不过,具有一定程度的 PHP、JavaScript 和 HTML 相关经验会有助于您了解所有代码。
目标
- 了解和部署 Cloud Run 函数。
- 了解并部署 App Engine 应用。
- 试用该应用。
费用
在本文档中,您将使用 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 functions, Pub/Sub, and Cloud Translation APIs.
-
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 functions, Pub/Sub, and Cloud Translation APIs.
-
在 Google Cloud 控制台中,通过 Cloud Shell 打开该应用。
利用 Cloud Shell,您可以直接在浏览器中通过命令行访问云端资源。在浏览器中打开 Cloud Shell,然后点击继续下载示例代码并切换到应用目录。
- 在 Cloud Shell 中,配置
gcloud
工具以使用您的 Google Cloud 项目:# Configure gcloud for your project gcloud config set project YOUR_PROJECT_ID
了解 Cloud Run 函数
- 该函数首先导入多个依赖项,例如 Firestore 和 Translation。它还包含一些全局变量和类型。
- 系统初始化全局 Firestore 和 Translation 客户端,以便可以在各函数调用之间重复使用它们。如此一来, 无需为每次函数调用都初始化新的客户端, 会降低执行速度
- Translation API 会将字符串翻译为您选择的语言。
-
Cloud Run 函数首先初始化 Firestore,然后 Pub/Sub 客户端。然后,它会解析 Pub/Sub 消息,以获取要翻译的文本和所需的目标语言。
然后,该应用会为翻译请求提供一个专属的名称,以确保它不会存储任何重复的翻译。然后,该函数在 Firestore 事务中进行翻译,以确保并发执行不会意外地两次运行同一翻译。
部署 Cloud Run 函数
在 Cloud Shell 中,在
translate.go
文件所在的目录中,部署 将 Cloud Run 函数与 Pub/Sub 触发器结合使用:gcloud functions deploy Translate --runtime go111 \ --trigger-topic=translate --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_GOOGLE_CLOUD_PROJECT
其中
YOUR_GOOGLE_CLOUD_PROJECT
是您的 Google Cloud 项目 ID。
了解应用
Web 应用具有两个主要组件:
-
用于处理 Web 请求的 Go HTTP 服务器。该服务器具有以下两个端点:
/
:列出所有现有翻译,并显示一个用户可以提交以请求新翻译的表单。/request-translation
:提交的表单会被发送到此端点,然后此端点将请求发布到 Pub/Sub 进行异步翻译。
- 一个 HTML 模板,该模板由 PHP 服务器使用现有译文进行填充。
HTTP 服务器
在
index
目录中,main.go
首先设置应用并注册 HTTP 处理程序:索引处理程序 (
/
) 从 Firestore 获取所有现有翻译,并使用以下列表填充 HTML 模板:通过提交 HTML 表单来请求新的翻译。在
/request-translation
注册的请求翻译处理程序会解析表单提交,验证请求,并向 Pub/Sub 发布一条消息:
HTML 模板
HTML 模板是显示给用户的 HTML 页面的基础,以便他们可以看到之前的翻译和请求新的翻译。该模板由 HTTP 服务器使用现有翻译列表填充。
-
HTML 模板的
<head>
元素包含该页面的元数据、样式表和 JavaScript:该页面会拉取 Material Design Lite (MDL) CSS 和 JavaScript 资产。借助 MDL,您可以向您的网站添加 Material Design 外观和风格。
该页面使用 JQuery 等待文档完成加载并设置表单提交处理程序。 提交请求翻译表单后,该页面会进行最小的表单验证,以检查值是否不为空,然后将异步请求发送到
/request-translation
端点。最后,系统会显示一个 MDL 信息提示控件,指示请求是否成功或是否出错。
- 页面的 HTML 正文使用 MDL 布局和多个 MDL 组件来显示翻译列表和用于请求其他翻译的表单:
构建应用
-
在尝试部署 Web 应用之前,请构建应用以确保其能够编译并且所有依赖项都能正常运行。
go build -o start ./index
如果未输出任何内容并且
start
文件已创建,则表示构建成功。
部署 Web 应用
通过 App Engine 标准环境,您可以构建和部署在繁重负载和大量数据的压力下仍能可靠运行的应用。
本教程使用 App Engine 标准环境来部署 HTTP 前端。
app.yaml
配置 App Engine 应用:
- 在
app.yaml
文件所在目录中,将您的应用部署到 App Engine 标准环境:gcloud app deploy
测试应用
部署 Cloud Run 函数和 App Engine 应用后,尝试请求翻译。
-
如需在浏览器中查看该应用,请输入以下网址:
https://PROJECT_ID.REGION_ID.r.appspot.com
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 IDREGION_ID
:App Engine 分配给您的应用的代码
您将看到一个页面,其中包含一个空翻译列表和一个用于请求新翻译的表单。
- 在要翻译的文本 (Text to translate) 字段中,输入一些要翻译的文本,例如
Hello, World
。 - 从下拉列表中选择一种要将文本翻译成的语言。
- 点击提交。
- 如需刷新页面,请点击刷新 refresh。翻译列表中具有一个新行。如果您未看到翻译,请再等待几秒钟,然后重试。如果您仍未看到翻译,请参阅有关调试应用的下一部分。
调试应用
如果您无法连接到 App Engine 应用或未看到新的翻译,请检查以下内容:
-
检查
gcloud
部署命令是否已成功完成,并且未输出任何错误。如果存在错误,请进行修复,然后再次尝试部署 Cloud Run 函数和 App Engine 应用。 -
在 Google Cloud 控制台中,转到“日志查看器”页面。
转到“日志查看器”页面- 在最近选择的资源下拉列表中,点击 GAE 应用,然后点击所有 module_id。您将看到访问您的应用时的请求列表,如果您未发现请求列表,请确认您是否已从下拉列表中选择所有 module_id。如果您发现 Google Cloud 控制台出现错误消息,请检查应用代码是否与“了解应用”相关部分中的代码匹配。
-
在最近选择的资源下拉列表中,点击 Cloud Functions 函数,然后点击所有函数名称 (All function name)。您将看到针对每个请求的翻译列出的函数。否则,请检查
Cloud Run 函数和 App Engine 应用使用相同的
Pub/Sub 主题:
- 在
background/index/main.go
文件中,检查topicName
常量是否为"translate"
。 - 当您
部署 Cloud Run 函数。
请务必添加
--trigger-topic=translate
标志。
- 在
清理
为避免因本教程中使用的资源导致您的 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.
删除 App Engine 实例
- In the Google Cloud console, go to the Versions page for App Engine.
- Select the checkbox for the non-default app version that you want to delete.
- 如需删除应用版本,请点击 删除。
删除 Cloud Run 函数
-
删除您在本教程中创建的 Cloud Run 函数:
gcloud functions delete Translate
后续步骤
- 尝试更多 Cloud Run 函数教程。
- 详细了解 App Engine。
- 试用 Cloud Run,该平台可让您在完全托管式环境或您的自定义 Google Kubernetes Engine 集群中运行无状态容器。