许多应用都需要在网络请求的具体情境之外进行后台处理。本教程创建了一个 Web 应用,让用户输入要翻译的文本,然后显示之前的翻译的列表。翻译在后台进程中完成,避免阻止用户的请求。
下图展示了翻译请求过程。
教程的应用运行顺序如下:
- 访问网页,查看存储在 Firestore 中的之前的翻译的列表。
- 通过输入 HTML 表单请求翻译文本。
- 翻译请求被发布到 Pub/Sub。
- 触发已订阅该 Pub/Sub 主题的 Cloud Functions 函数。
- Cloud Functions 函数使用 Cloud Translation 来翻译文本。
- Cloud Functions 函数将结果存储在 Firestore 中。
本教程适用于有兴趣了解如何使用 Google Cloud 进行后台处理的用户。无需任何有关 Pub/Sub、Firestore、App Engine 或 Cloud Functions 的先前经验。不过,具有一定程度的 Python、JavaScript 和 HTML 相关经验会有助于您了解所有代码。
目标
- 了解并部署 Cloud Functions 函数。
- 了解并部署 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 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 Functions, Pub/Sub, and Cloud Translation APIs.
-
在 Google Cloud Console 中,在 Cloud Shell 中打开该应用。
利用 Cloud Shell,您可以直接在浏览器中通过命令行访问云端资源。在浏览器中打开 Cloud Shell,然后点击继续下载示例代码并切换到应用目录。
-
在 Cloud Shell 中,配置
gcloud
工具以使用您的 Google Cloud 项目:# Configure gcloud for your project gcloud config set project YOUR_PROJECT_ID
了解 Cloud Functions 函数
- 该函数首先导入多个依赖项,例如 Firestore 和 Translation。
- 系统初始化全局 Firestore 和 Translation 客户端,以便可以在各函数调用之间重复使用它们。这样,您便无需针对每次函数调用初始化新的客户端(此操作会降低执行速度)。
- Translation API 会将字符串翻译为您选择的语言。
-
Cloud Functions 函数首先解析 Pub/Sub 消息,以获取要翻译的文本和所需的目标语言。
然后,Cloud Functions 函数会翻译文本并将其存储在 Firestore 中,并使用事务来确保没有重复的翻译。
部署 Cloud Functions 函数
在 Cloud Shell 的
function
目录中,使用 Pub/Sub 触发器部署 Cloud Functions 函数:gcloud functions deploy Translate --runtime=python37 \ --entry-point=translate_message --trigger-topic=translate \ --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_GOOGLE_CLOUD_PROJECT
其中
YOUR_GOOGLE_CLOUD_PROJECT
是您的 Google Cloud 项目 ID。
了解应用
Web 应用有两个主要组件:
-
用于处理 Web 请求的 Python HTTP 服务器。该服务器具有以下两个端点:
-
/
:列出所有现有翻译,并显示一个用户可以提交新翻译请求的表单。 -
/request-translation
:表单提交被发送到此端点,此端点将请求发布到 Pub/Sub 进行异步翻译。
-
- 由 Python 服务器使用现有译文填充的 HTML 模板。
HTTP 服务器
在
app
目录中,main.py
首先导入依赖项、创建 Flask 应用、初始化 Firestore 和 Translation 客户端以及定义支持的语言列表:索引处理程序 (
/
) 从 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 应用
通过 App Engine 标准环境,您可以构建和部署在繁重负载和大量数据的压力下仍能可靠运行的应用。
本教程使用 App Engine 标准环境来部署 HTTP 前端。
app.yaml
配置 App Engine 应用:
-
从
app.yaml
文件所在的目录中,将您的应用部署到 App Engine 标准环境:gcloud app deploy
测试应用
部署 Cloud Functions 函数和 App Engine 应用后,请尝试请求翻译。
-
要在浏览器中查看该应用,请输入以下网址:
https://PROJECT_ID.REGION_ID.r.appspot.com
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 IDREGION_ID
:App Engine 分配给您的应用的代码
该页面包含一个空的翻译列表,以及一个用于请求新翻译的表单。
-
在要翻译的文本字段中,输入一些要翻译的文本,例如
Hello, World
。 - 从下拉列表中选择一种要将文本翻译成的语言。
- 点击提交。
- 如需刷新页面,请点击刷新 refresh。翻译列表中具有一个新行。如果您未看到翻译,请再等待几秒钟,然后重试。如果您仍未看到翻译,请参阅有关调试应用的下一部分。
调试应用
如果您无法连接到 App Engine 应用或看不到新的翻译,请检查以下内容:
-
检查
gcloud
部署命令是否已成功完成,并且未输出任何错误。如果存在错误,请进行修复,然后再次尝试部署 Cloud Functions 函数和 App Engine 应用。 -
在 Google Cloud Console 中,转到“日志查看器”页面。
转到“日志查看器”页面- 在最近选择的资源下拉列表中,点击 GAE 应用,然后点击所有 module_id。您将看到访问您的应用时的请求列表,如果您未发现请求列表,请确认您是否已从下拉列表中选择所有 module_id。如果您发现 Cloud Console 出现错误消息,请检查应用代码是否与“了解应用”相关部分中的代码匹配。
-
在最近选择的资源下拉列表中,点击 Cloud Functions 函数,然后点击所有函数名称 (All function name)。您将看到针对每个请求的翻译列出的函数。如果未看到,请检查 Cloud Functions 函数和 App Engine 应用是否使用相同的 Pub/Sub 主题:
- 在
background/main.py
文件中,检查topic_name
是否为"translate"
。 - 部署 Cloud Functions 函数时,请务必包含
--trigger-topic=translate
标志。
- 在
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除 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 Functions 函数
-
删除您在本教程中创建的 Cloud Functions 函数:
gcloud functions delete Translate
后续步骤
- 请试用其他 Cloud Functions 教程。
- 详细了解 App Engine。
- 试用 Cloud Run,该平台可让您在完全托管式环境或您的自定义 Google Kubernetes Engine 集群中运行无状态容器。