本教程介绍如何通过 Pub/Sub 推送订阅编写、部署和调用 Cloud Run 服务。
目标
- 编写、构建服务并将其部署到 Cloud Run for Anthos
- 通过向 Pub/Sub 主题发布消息来调用该服务。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
准备工作
-
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.
- 启用 Cloud Run for Anthos API
- 安装并初始化 gcloud CLI。
- 安装
kubectl
组件:gcloud components install kubectl
- 更新组件:
gcloud components update
- 如果您使用的是 Cloud Run for Anthos,请按照设置 Cloud Run for Anthos 中的说明创建新集群。
设置 gcloud 默认值
如需为您的 Cloud Run for Anthos 服务配置 gcloud 默认值,请执行以下操作:
设置默认项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您在本教程中使用的项目名称。
为您的集群配置 gcloud:
gcloud config set run/platform gke gcloud config set run/cluster CLUSTER-NAME gcloud config set run/cluster_location REGION
您需要将其中的:
- 将 CLUSTER-NAME 替换为您使用的集群名称。
- 将 REGION 替换为您选择的受支持的集群位置。
创建 Pub/Sub 主题
示例服务由发布到 Pub/Sub 主题的消息触发,因此您需要在 Pub/Sub 中创建主题。
如需创建新的 Pub/Sub 主题,请使用以下命令:
gcloud pubsub topics create myRunTopic
您可以使用 myRunTopic 或将其替换为 Cloud 项目中唯一的主题名称。
检索代码示例
如需检索可用的代码示例,请执行以下操作:
将示例应用代码库克隆到本地机器:
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run for Anthos 示例代码的目录:
Node.js
cd nodejs-docs-samples/run/pubsub/
Python
cd python-docs-samples/run/pubsub/
Go
cd golang-samples/run/pubsub/
Java
cd java-docs-samples/run/pubsub/
查看代码
本教程中使用的代码包含以下部分:
处理传入请求的服务器。
Node.js
为了便于测试 Node.js 服务,服务器配置与服务器启动是相互独立的。Node.js Web 服务器在
网络服务器在app.js
中设置。index.js
中启动:Python
Go
Java
用于处理 Pub/Sub 消息并记录问候语的处理程序。
Node.js
Python
Go
Java
您必须对该服务进行编码,使其返回准确的 HTTP 响应代码。如果返回成功代码(例如 HTTP
200
或204
),则指示 Pub/Sub 消息处理已完成。如果返回错误代码(如 HTTP400
或500
),则指示将重试该消息(请参阅“通过推送方式接收消息”指南。用于定义服务的操作环境的
Dockerfile
。Dockerfile
的内容因语言而异。Node.js
Python
Go
Java
此示例使用 Jib 利用常见 Java 工具构建 Docker 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 Jib 构建 Java 容器。
如需详细了解如何对 Pub/Sub 请求的来源进行身份验证,请参阅下文中的与 Pub/Sub 集成部分。
交付代码
交付代码包括三个步骤:使用 Cloud Build 构建容器映像、将容器映像上传到 Container Registry,以及将容器映像部署到 Cloud Run for Anthos。
要开发代码,请执行以下操作:
构建容器并将其发布到 Container Registry 上:
Node.js
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
其中 PROJECT_ID 是您的 Cloud 项目 ID,
pubsub
是您要为服务指定的名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Container Registry 中,并可根据需要重复使用。
Python
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
其中 PROJECT_ID 是您的 Cloud 项目 ID,
pubsub
是您要为服务指定的名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Container Registry 中,并可根据需要重复使用。
Go
gcloud builds submit --tag gcr.io/PROJECT_ID/pubsub
其中 PROJECT_ID 是您的 Cloud 项目 ID,
pubsub
是您要为服务指定的名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Container Registry 中,并可根据需要重复使用。
Java
mvn compile jib:build -Dimage=gcr.io/PROJECT_ID/pubsub
其中 PROJECT_ID 是您的 Cloud 项目 ID,
pubsub
是您要为服务指定的名称。成功后,您会看到一条 BUILD SUCCESS 消息。该映像存储在 Container Registry 中,并可根据需要重复使用。
运行以下命令来部署您的应用:
gcloud run deploy pubsub-tutorial --image gcr.io/PROJECT_ID/pubsub
将 PROJECT_ID 替换为您的 Cloud 项目 ID。
pubsub
为容器名称,pubsub-tutorial
为服务名称。请注意,容器映像已部署到您之前在设置 gcloud 中配置的服务和集群等待部署完成,这可能需要半分钟左右的时间。 成功完成时,命令行会显示服务网址。此网址用于配置 Pub/Sub 订阅。
如果要将代码更新部署到该服务,请重复执行上述步骤。向服务执行的每次部署都会创建一个新的修订版本,该修订版本准备就绪后会自动开始处理流量。
与 Pub/Sub 集成
部署完 Cloud Run 服务后,我们将配置 Pub/Sub 以向其推送消息。
如需将该服务与 Pub/Sub 集成,请执行以下操作:
允许 Pub/Sub 在您的项目中创建身份验证令牌:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT-NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
替换
- 将 PROJECT_ID 替换为您的 Cloud 项目 ID。
- 将 PROJECT-NUMBER 替换为您的 Cloud 项目编号。
创建或选择一个服务帐号,用于表示 Pub/Sub 订阅身份。
gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run for Anthos Pub/Sub Invoker"
您可以使用
cloud-run-pubsub-invoker
或将其替换为 Cloud 项目中唯一的名称。使用该服务帐号创建 Pub/Sub 订阅:
为您的集群启用自动 TLS 和 HTTPS 并向您的服务添加网域映射。
为 Pub/Sub 注册网域所有权。
添加代码以验证附加到 Pub/Sub 消息的身份验证令牌。 示例代码在使用推送端点执行身份验证和授权中提供。
身份验证必须确保令牌有效且与预期的服务帐号相关联。与 Cloud Run 不同,Cloud Run for Anthos 没有内置授权检查可验证令牌是否有效,或者服务帐号是否有权调用 Cloud Run for Anthos 服务。
使用该服务帐号创建 Pub/Sub 订阅:
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
替换
- 将 myRunTopic 替换为之前创建的主题。
- 将 SERVICE-URL 替换为您的自定义服务网址。
指定
https
作为协议。 - 将 PROJECT_ID 替换为您的 Cloud 项目 ID。
--push-auth-service-account
标志激活 Pub/Sub 推送功能,以进行身份验证和授权。
您的服务现已与 Pub/Sub 全面集成。
测试
如需测试端到端解决方案,请按如下所述操作:
向该主题发送一条 Pub/Sub 消息:
gcloud pubsub topics publish myRunTopic --message "Runner"
除了使用命令行(如本教程中所示),您还可以编程方式发布消息。如需了解详情,请参阅发布消息。
导航到服务日志:
转到 Google Cloud 控制台中的 Cloud Run for Anthos 页面:
点击
pubsub-tutorial
服务。选择日志标签页。
您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻再检查一次。
查找“Hello Runner!”消息。
清理
如需浏览有关如何将 Cloud Run for Anthos 与 Pub/Sub 搭配使用的更深层用例,请暂时跳过清理,继续阅读图片处理教程。
如果您为本教程创建了一个新项目,请删除项目。 如果您使用的是现有项目,希望保留此项目且不保留本教程中添加的任何更改,请删除为教程创建的资源。
删除项目
为了避免产生费用,最简单的方法是删除您为本教程创建的项目。
如需删除项目,请执行以下操作:
- 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 for Anthos 服务:
gcloud run services delete SERVICE-NAME
其中,SERVICE-NAME 是您选择的服务名称。
您还可以在 Google Cloud 控制台中删除 Cloud Run for Anthos 服务。
移除您在教程设置过程中添加的 gcloud 默认配置:
gcloud config unset run/platform gcloud config unset run/cluster gcloud config unset run/cluster_location
移除项目配置:
gcloud config unset project
删除在本教程中创建的其他 Google Cloud 资源:
- 删除 Pub/Sub 主题
myRunTopic
- 删除 Pub/Sub 订阅
myRunSubscription
- 从 Container Registry 中删除名为
gcr.io/PROJECT_ID/pubsub
的容器映像。 - 删除调用方服务帐号
cloud-run-pubsub-invoker@PROJECT_ID.iam.gserviceaccount.com
- 如果您为本教程创建了一个集群,请删除集群
- 删除 Pub/Sub 主题
后续步骤
- 展开本教程中部署的示例服务,以添加用于修改上传到 Cloud Storage 的图片的图片处理功能。
- 详细了解如何将主题整合到 Pub/Sub 架构中以及如何管理主题
- 如需详细了解 Pub/Sub 订阅,请参阅管理订阅。
- 探索有关 Google Cloud 的参考架构、图表和最佳实践。查看我们的 Cloud Architecture Center。