区域 ID
REGION_ID
是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r
包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。
详细了解区域 ID。
Pub/Sub 可在应用之间提供可靠的多对多异步消息传递服务。发布者应用可以向某一主题发送消息,其他应用可以订阅该主题以接收消息。
本文档介绍了如何使用 Cloud 客户端库在 App Engine 应用中发送和接收 Pub/Sub 消息。前提条件
- 按照相关说明为您选择的运行时构建应用以设置您的环境和项目,并了解如何设计 App Engine 应用的结构。
- 记下并保存项目 ID,因为您需要用它来运行本文档中所述的示例应用。
- 创建服务账号和服务账号密钥以用于您的应用。
-
Enable the Google Cloud Pub/Sub API.
克隆示例应用
将示例应用复制到本地机器,然后导航到 pubsub
目录:
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples.git
cd golang-samples/appengine/go11x/pubsub/authenicated_push
Java
没有适用于此运行时的示例。
请注意,柔性环境中提供 Java 演示版应用。
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/pubsub
PHP
git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
cd php-docs-samples/pubsub
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/appengine/standard_python3/pubsub
Ruby
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples
cd ruby-docs-samples/appengine/pubsub
创建主题和订阅
创建主题和订阅,并在订阅中指定 Pub/Sub 服务器应发送请求的目标端点:
Go
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
Java
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
Node.js
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
PHP
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
Python
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
Ruby
# Configure the topic gcloud pubsub topics create YOUR_TOPIC_NAME # Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10
用随机密钥令牌替换 YOUR_TOKEN
。推送端点使用它来验证请求。
如需将 Pub/Sub 与身份验证搭配使用,请创建另一个订阅:
# Configure the push subscription gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \ --topic=YOUR_TOPIC_NAME \ --push-auth-service-account=YOUR-SERVICE-ACCOUNT-EMAIL\ --push-auth-token-audience=OPTIONAL_AUDIENCE_OVERRIDE\ --push-endpoint=https://YOUR_PROJECT_ID.REGION_ID.r.appspot.com/push-handlers/receive_messages?token=YOUR_TOKEN \ --ack-deadline=10 # Your service agent # `service-{PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com` needs to have the # `iam.serviceAccountTokenCreator` role. PUBSUB_SERVICE_ACCOUNT="service-${PROJECT_NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member="serviceAccount:${PUBSUB_SERVICE_ACCOUNT}"\ --role='roles/iam.serviceAccountTokenCreator'
将 YOUR-SERVICE-ACCOUNT-EMAIL
替换为您的服务账号电子邮件地址。
设置环境变量
Go
修改 app.yaml
文件,以为您的主题和验证令牌设置环境变量:
Java
修改 app.yaml
文件,以为您的主题和验证令牌设置环境变量:
env_variables:
PUBSUB_TOPIC: <your-topic-name>
PUBSUB_VERIFICATION_TOKEN: <your-verification-token>
Node.js
修改 app.yaml
文件,以为您的主题和验证令牌设置环境变量:
PHP
修改 index.php
文件,为您的主题和订阅设置环境变量:
Python
修改 app.yaml
文件,为您的项目 ID、主题和验证令牌设置环境变量:
Ruby
修改 app.standard.yaml
文件,为您的项目 ID、主题和验证令牌设置环境变量:
代码审核
示例应用使用 Pub/Sub 客户端库。
Go
示例应用使用您在 app.yaml
文件(PUBSUB_TOPIC
和 PUBSUB_VERIFICATION_TOKEN
)中设置的环境变量进行配置。
此实例接收的消息存储在切片中:
messages []string
receiveMessagesHandler
函数接收推送的消息,验证令牌,并将消息添加到 messages
切片:
Java
没有适用于此运行时的示例。
请注意,柔性环境中提供 Java 演示版应用。
Node.js
示例应用使用您在 app.yaml
文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:
// The following environment variables are set by the `app.yaml` file when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);
示例应用维护一个全局列表以存储此实例接收的消息:
// List of all messages received by this instance
var messages = [];
此方法接收推送的消息并将其添加到 messages
全局列表中:
此方法与 App Engine Web 应用交互,以发布新消息并显示收到的消息:
PHP
示例应用使用您在 app.yaml
文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:
示例应用维护一个全局列表以存储此实例接收的消息:
$messages = [];
pull
方法从您创建的主题中检索消息,并将消息添加到消息列表中:
publish
方法向主题发布新消息:
Python
示例应用使用您在 app.yaml
文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:
app.config['PUBSUB_VERIFICATION_TOKEN'] = \
os.environ['PUBSUB_VERIFICATION_TOKEN']
app.config['PUBSUB_TOPIC'] = os.environ['PUBSUB_TOPIC']
示例应用维护一个全局列表以存储此实例接收的消息:
MESSAGES = []
receive_messages_handler()
方法会接收推送的消息并将其添加到 MESSAGES
全局列表中:
index()
方法与 App Engine Web 应用交互,以发布新消息并显示收到的消息:
Ruby
示例应用使用您在 app.standard.yaml
文件中设置的值来配置环境变量。推送请求处理程序使用这些值来确认请求来自 Pub/Sub 且来源可信:
示例应用维护一个全局列表以存储此实例接收的消息:
此方法接收推送的消息并将其添加到 messages
全局列表中:
此方法与 App Engine 网络应用交互,以发布新消息并显示收到的消息:
在本地运行示例
在本地运行时,您可以借助 Google Cloud CLI 提供身份验证以使用 Google Cloud API。假设您按照前提条件中的说明设置了环境,那么您已经运行了 gcloud init
命令,该命令可提供此身份验证。
Go
在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-token]
export PUBSUB_TOPIC=[your-topic]
go run pubsub.go
Java
在启动应用之前设置环境变量:
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
如需在本地运行您的应用,请使用您的常用开发工具。
Node.js
在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start
PHP
使用 Composer 安装依赖项:
composer install
然后在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
php -S localhost:8080
Python
安装依赖项(最好在虚拟环境中)。
Mac OS/Linux
- 创建一个独立的 Python 环境:
python3 -m venv env
source env/bin/activate
- 如果您当前不在包含示例代码的目录中,则导航到包含
hello_world
示例代码的目录。然后安装依赖项:cd YOUR_SAMPLE_CODE_DIR
pip install -r requirements.txt
Windows
使用 Powershell 运行 Python 包。
- 找到已安装的 PowerShell。
- 右键点击 Powershell 的快捷方式,并以管理员身份启动。
- 创建一个独立的 Python 环境。
python -m venv env
.\env\Scripts\activate
- 导航到项目目录并安装依赖项。如果您当前不在包含示例代码的目录中,则导航到包含
hello_world
示例代码的目录。然后安装依赖项:cd YOUR_SAMPLE_CODE_DIR
pip install -r requirements.txt
然后在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
python main.py
Ruby
安装依赖项:
bundle install
然后在启动应用之前设置环境变量:
export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
bundle exec ruby app.rb -p 8080
模拟推送通知
应用可以在本地发送消息,但无法在本地接收推送消息。但是,您可以向本地推送通知端点发送 HTTP 请求来模拟推送消息。该示例包含文件 sample_message.json
。
Go
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
或
http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
响应:
HTTP/1.1 200 OK
Date: Tue, 13 Nov 2018 16:04:18 GMT
Content-Length: 0
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
Java
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
或
http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
Node.js
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/push-handlers/receive_messages?token=[your-token]"
或
http POST ":8080/push-handlers/receive_messages?token=[your-token]" < sample_message.json
响应:
HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
PHP
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -i --data @sample_message.json "localhost:4567/push-handlers/receive_messages?token=[your-token]"
或
http POST ":4567/push-handlers/receive_messages?token=[your-token]" < sample_message.json
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
Python
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"
或
http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json
响应:
HTTP/1.0 200 OK
Content-Length: 2
Content-Type: text/html; charset=utf-8
Date: Mon, 10 Aug 2015 17:52:03 GMT
Server: Werkzeug/0.10.4 Python/2.7.10
OK
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
Ruby
您可以使用 curl
或 httpie
客户端发送 HTTP POST
请求:
curl -i --data @sample_message.json "localhost:4567/push-handlers/receive_messages?token=[your-token]"
或
http POST ":4567/push-handlers/receive_messages?token=[your-token]" < sample_message.json
响应:
HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8
Content-Length: 13
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Server: WEBrick/1.3.1 (Ruby/2.3.0/2015-12-25)
Date: Wed, 20 Apr 2016 20:56:23 GMT
Connection: Keep-Alive
Hello, World!
请求完成后,您可以刷新 localhost:8080
并在收到的消息列表中查看该消息。
在 App Engine 上运行
如需使用 gcloud
命令行工具将演示版应用部署到 App Engine,请执行以下操作:
Go
从 app.yaml
文件所在的目录运行以下命令:
gcloud app deploy
Java
从 app.yaml
文件所在的目录运行 gcloud
命令:
gcloud app deploy
如需使用 Maven 部署应用,请运行以下命令:
mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID
将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。 如果您的 pom.xml
文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId
属性。
Node.js
从 app.yaml
文件所在的目录运行以下命令:
gcloud app deploy
PHP
从 app.yaml
文件所在的目录运行以下命令:
gcloud app deploy
Python
从 app.yaml
文件所在的目录运行以下命令:
gcloud app deploy
Ruby
从 app.yaml
文件所在的目录运行以下命令:
gcloud app deploy app.standard.yaml
您现在可以通过 https://PROJECT_ID.REGION_ID.r.appspot.com
访问该应用。您可以使用表单提交消息,但无法保证您的哪个应用实例会收到通知。您可以发送多条消息并刷新页面,以查看收到的消息。