本教程介绍如何通过 Pub/Sub 推送订阅编写、部署和调用 Cloud Run 服务。
设置 gcloud 默认值
要配置您的 Cloud Run 服务的 gcloud 默认值,请执行以下操作:
设置默认项目:
gcloud config set project PROJECT_ID
将 PROJECT_ID 替换为您在本教程中创建的项目的名称。
为您选择的区域配置 gcloud:
gcloud config set run/region REGION
将 REGION 替换为您选择的受支持的 Cloud Run 区域。
Cloud Run 位置
Cloud Run 是区域级的,这意味着运行 Cloud Run 服务的基础架构位于特定区域,并且由 Google 代管,以便在该区域内的所有可用区以冗余方式提供。
选择用于运行 Cloud Run 服务的区域时,主要考虑该区域能否满足您的延迟时间、可用性或耐用性要求。通常,您可以选择距离用户最近的区域,但除此之外,您还应该考虑 Cloud Run 服务使用的其他 Google Cloud产品的位置。跨多个位置使用 Google Cloud 产品可能会影响服务的延迟时间和费用。
Cloud Run 可在以下区域使用:
基于层级 1 价格
asia-east1
(台湾)asia-northeast1
(东京)asia-northeast2
(大阪)asia-south1
(印度孟买)europe-north1
(芬兰)二氧化碳排放量低
europe-north2
(斯德哥尔摩)二氧化碳排放量低
europe-southwest1
(马德里)二氧化碳排放量低
europe-west1
(比利时)二氧化碳排放量低
europe-west4
(荷兰)二氧化碳排放量低
europe-west8
(米兰)europe-west9
(巴黎)二氧化碳排放量低
me-west1
(特拉维夫)northamerica-south1
(墨西哥)us-central1
(爱荷华)二氧化碳排放量低
us-east1
(南卡罗来纳)us-east4
(北弗吉尼亚)us-east5
(哥伦布)us-south1
(达拉斯)二氧化碳排放量低
us-west1
(俄勒冈)二氧化碳排放量低
基于层级 2 价格
africa-south1
(约翰内斯堡)asia-east2
(香港)asia-northeast3
(韩国首尔)asia-southeast1
(新加坡)asia-southeast2
(雅加达)asia-south2
(印度德里)australia-southeast1
(悉尼)australia-southeast2
(墨尔本)europe-central2
(波兰,华沙)europe-west10
(柏林)europe-west12
(都灵)europe-west2
(英国伦敦)二氧化碳排放量低
europe-west3
(德国法兰克福)europe-west6
(瑞士苏黎世)二氧化碳排放量低
me-central1
(多哈)me-central2
(达曼)northamerica-northeast1
(蒙特利尔)二氧化碳排放量低
northamerica-northeast2
(多伦多)二氧化碳排放量低
southamerica-east1
(巴西圣保罗)二氧化碳排放量低
southamerica-west1
(智利圣地亚哥)二氧化碳排放量低
us-west2
(洛杉矶)us-west3
(盐湖城)us-west4
(拉斯维加斯)
如果您已创建 Cloud Run 服务,可在Google Cloud 控制台的 Cloud Run 信息中心内查看区域。
创建 Artifact Registry 标准制品库
创建 Artifact Registry 标准制品库以存储您的容器映像:
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=REGION
您需要进行如下替换:
- 将 REPOSITORY 替换为制品库的唯一名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
创建 Pub/Sub 主题
示例服务由发布到 Pub/Sub 主题的消息触发,因此您需要在 Pub/Sub 中创建主题。
gcloud
如需创建新的 Pub/Sub 主题,请使用以下命令:
gcloud pubsub topics create myRunTopic
您可以使用 myRunTopic 或将其替换为 Google Cloud 项目中唯一的主题名称。
Terraform
如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令。
要创建 Pub/Sub 主题,请将以下内容添加到现有的 main.tf
文件中:
您可以使用 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 文件并将其解压缩。
C#
git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
或者,您也可以下载该示例的 zip 文件并将其解压缩。
切换到包含 Cloud Run 示例代码的目录:
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/
C#
cd dotnet-docs-samples/run/Run.Samples.Pubsub.MinimalApi/
查看代码
本教程中使用的代码包含以下部分:
处理传入请求的服务器。
Node.js
为了便于测试 Node.js 服务,服务器配置与服务器启动是相互独立的。
Node.js Web 服务器在
app.js
中设置。网络服务器在
index.js
中启动:Python
Go
Java
C#
用于处理 Pub/Sub 消息并记录问候语的处理程序。
Node.js
Python
Go
Java
C#
您必须对该服务进行编码,使其返回准确的 HTTP 响应代码。如果返回成功代码(例如 HTTP
200
或204
),则指示 Pub/Sub 消息处理已完成。如果返回错误代码(如 HTTP400
或500
),则指示将重试该消息(请参阅“通过推送方式接收消息”指南。用于定义服务的操作环境的
Dockerfile
。Dockerfile
的内容因语言而异。Node.js
Python
Go
Java
此示例使用 Jib 利用常见 Java 工具构建 Docker 映像。无需编写 Dockerfile 或安装 Docker,Jib 便可以优化容器构建。详细了解如何使用 Jib 构建 Java 容器。
C#
如需详细了解如何对 Pub/Sub 请求的来源进行身份验证,请参阅与 Pub/Sub 集成。
交付代码
交付代码包括三个步骤:使用 Cloud Build 构建容器映像、将容器映像上传到 Artifact Registry,以及将容器映像部署到 Cloud Run。
如需交付代码,请执行以下操作:
-
构建容器并将其发布到 Artifact Registry 上:
Node.js
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Python
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Go
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
Java
-
使用 gcloud CLI 凭据帮助程序,授权 Docker 推送到您的 Artifact Registry。
gcloud auth configure-docker
-
使用 Jib Maven 插件来构建容器并将其推送到 Artifact Registry。
您需要进行如下替换:mvn compile jib:build -D image=REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称。成功后,您会看到一条 BUILD SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
C#
您需要进行如下替换:gcloud builds submit --tag REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称。成功完成后,您应该会看到一条包含 ID、创建时间和映像名称的 SUCCESS 消息。该映像存储在 Artifact Registry 中,并可根据需要重复使用。
-
部署应用:
命令行
-
运行以下命令来部署您的应用:
您需要进行如下替换:gcloud run deploy pubsub-tutorial --image REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub --no-allow-unauthenticated
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 REPOSITORY 替换为 Artifact Registry 制品库的名称。
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
pubsub
是映像名称,pubsub-tutorial
是服务名称。请注意,容器映像会部署到您之前在设置 gcloud 下配置的服务和区域--no-allow-unauthenticated
标志限制对服务未经身份验证的访问。通过将该服务保留为不公开状态,您可以依赖 Cloud Run 的自动 Pub/Sub 集成功能对请求进行身份验证。如需详细了解如何进行此项配置,请参阅与 Pub/Sub 集成。如需详细了解基于 Identity and Access Management (IAM) 的身份验证,请参阅使用 IAM 管理访问权限。等待部署完成,这可能需要半分钟左右的时间。 成功完成时,命令行会显示服务网址。此网址用于配置 Pub/Sub 订阅。
-
如果要将代码更新部署到该服务,请重复执行上述步骤。向服务执行的每次部署都会创建一个新的修订版本,该修订版本准备就绪后会自动开始处理流量。
Terraform
如需创建 Cloud Run 服务,请将以下内容添加到现有
.tf
文件中。 您需要进行如下替换:resource "google_project_service" "cloudrun_api" { service = "run.googleapis.com" disable_on_destroy = false } resource "google_cloud_run_v2_service" "default" { name = "pubsub-tutorial" location = "REGION" template { containers { image = "IMAGE_URL" } } depends_on = [google_project_service.cloudrun_api] }
- 将 IMAGE_URL 替换为您的图片网址:
REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/pubsub
- 将 REGION 替换为要用于 Artifact Registry 仓库的 Google Cloud 区域。
-
与 Pub/Sub 集成
如需将该服务与 Pub/Sub 集成,请执行以下操作:
gcloud
创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。
gcloud iam service-accounts create cloud-run-pubsub-invoker \ --display-name "Cloud Run Pub/Sub Invoker"
您可以使用
cloud-run-pubsub-invoker
,或将其替换为 Google Cloud 项目内唯一的名称。使用该服务账号创建 Pub/Sub 订阅:
为调用方服务账号授予调用您的
pubsub-tutorial
服务的权限:gcloud run services add-iam-policy-binding pubsub-tutorial \ --member=serviceAccount:cloud-run-pubsub-invoker@PROJECT_ID. \ --role=roles/run.invoker
IAM 更改可能需要几分钟时间才能完成传播。在此期间,您可能会在服务日志中看到
HTTP 403
错误。允许 Pub/Sub 在您的项目中创建身份验证令牌:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub. \ --role=roles/iam.serviceAccountTokenCreator
您需要进行如下替换:
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
- 将 PROJECT_NUMBER 替换为您的 Google Cloud 项目编号。
Google Cloud 控制台中与您项目对应的“项目信息”面板中列出了项目 ID 和项目编号。
使用该服务账号创建 Pub/Sub 订阅:
gcloud pubsub subscriptions create myRunSubscription --topic myRunTopic \ --ack-deadline=600 \ --push-endpoint=SERVICE-URL/ \ --push-auth-service-account=cloud-run-pubsub-invoker@PROJECT_ID.
您需要进行如下替换:
- 将 myRunTopic 替换为之前创建的主题。
- 将 SERVICE-URL 替换为在部署服务时提供的 HTTPS 网址。即使您还添加了网域映射,此网址仍然有效。
- 将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。
--push-auth-service-account
标志激活 Pub/Sub 推送功能,以进行身份验证和授权。您的 Cloud Run 服务网域会自动注册用于 Pub/Sub 订阅。
仅适用于 Cloud Run,可以对令牌是否有效进行内置身份验证检查,以及对服务账号是否有权调用 Cloud Run 服务进行授权检查。
您的服务现已与 Pub/Sub 全面集成。
Terraform
创建或选择一个服务账号,用于表示 Pub/Sub 订阅身份。
使用该服务账号创建 Pub/Sub 订阅:
为调用方服务账号授予调用您的
pubsub-tutorial
服务的权限:允许 Pub/Sub 在您的项目中创建身份验证令牌:
使用该服务账号创建 Pub/Sub 订阅:
您的服务现已与 Pub/Sub 全面集成。
试试看
如需测试端到端解决方案,请按如下所述操作:
向该主题发送一条 Pub/Sub 消息:
gcloud pubsub topics publish myRunTopic --message "Runner"
除了使用命令行(如本教程中所示),您还可以编程方式发布消息。如需了解详情,请参阅发布消息。
进入服务日志:
- 前往 Google Cloud 控制台
- 点击
pubsub-tutorial
服务。 选择日志标签页。
您可能需要等待一些时间才能看到日志。如果您没有立即看到日志,请稍等片刻再检查一次。
查找“Hello Runner!”消息。