Create a Pub/Sub topic

检查我的进度

/ 10

Deploy the Lab Report Service: Build

检查我的进度

/ 15

Create a Revision for Cloud Run

检查我的进度

/ 15

Deploy the Email Service: Build

检查我的进度

/ 15

Create a new Revision

检查我的进度

/ 15

Create a service account

检查我的进度

/ 10

Create a Pub/Sub subscription

检查我的进度

/ 10

Deploy the SMS Service

检查我的进度

/ 10

此实验可能会提供 AI 工具来支持您学习。

GSP650

Google Cloud 自学实验 Pet Theory 徽标

概览

对于无服务器 Cloud Run 开发课程中的实验,您需要通读一个虚构的业务场景,并协助其中的人物完成无服务器迁移计划。

12 年前,Lily 创办了 Pet Theory 连锁宠物医院。多年来,宠物医院的数量不断增加,对自动化的需求也越来越高。在处理实验机构发回的医疗检验结果时,Pet Theory 采用的方式不仅速度太慢,而且容易出错,因此 Lily 想要改善这种情况。

目前,Pet Theory 的 IT 管理员 Patrick 还在靠人工处理检验结果。每当收到宠物的检验结果时,他都要先撰写邮件并发送给对应的客户,然后在手机上输入短信,将结果以短信形式发送给客户。

Patrick 正在与软件顾问 Ruby 合作,设计一个更具可伸缩性的系统。他们希望打造一套无需投入大量精力进行持续维护的解决方案。Patrick 和 Ruby 决定采用无服务器技术。

目标

在本实验中,您将学习如何完成以下操作:

  • 创建 Pub/Sub 主题和订阅。
  • 创建 Cloud Run 服务,以便发布和接收消息。
  • 创建 Pub/Sub 订阅,用于触发 Cloud Run 服务。
  • 测试系统的弹性。

前提条件

本实验假设您熟悉 Cloud 控制台和 shell 环境。本实验是一系列实验中的一个。完成之前的实验会有所帮助,但这不是硬性要求:

设置和要求

注意:在本实验中,请使用 Username 1 登录 Google Cloud 控制台。否则,您将在实验过程中遇到错误。

点击“开始实验”按钮前的注意事项

请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。

此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。

为完成此实验,您需要:

  • 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
  • 完成实验的时间 - 请注意,实验开始后无法暂停。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。

如何开始实验并登录 Google Cloud 控制台

  1. 点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。右侧是实验设置和访问权限面板,其中包含以下内容:

    • 打开 Google Cloud 控制台按钮
    • 您在本实验中必须使用的临时凭证(用户名和密码)
    • 帮助您逐步完成该实验所需的其他信息(如果需要)

    请注意,实验计时器位于页面顶部附近,将显示剩余时间。

  2. 点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。

    该实验会启动资源并打开另一个标签页,显示“登录”页面。

    提示:可以将这些标签页分别放在不同的窗口中,并排显示。

    注意:如果您看见选择账号对话框,请点击使用其他账号
  3. 如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。

    {{{user_0.username | "<用户名>"}}}

    您也可以在实验设置和访问权限面板中找到“用户名”。

  4. 点击下一步

  5. 复制下面的密码,然后将其粘贴到欢迎对话框中。

    {{{user_0.password | "<密码>"}}}

    您也可以在实验设置和访问权限面板中找到“密码”。

  6. 点击下一步

    重要提示:您必须使用实验提供的凭证。请勿使用您的 Google Cloud 账号凭证。 注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
  7. 依次点击进入后续页面:

    • 接受条款及条件。
    • 由于这是临时账号,请勿添加账号恢复选项或双重身份验证。
    • 请勿注册免费试用。

片刻之后,系统会在此标签页中打开 Google Cloud 控制台。

注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。 “导航菜单”图标和“搜索”字段

激活 Cloud Shell

Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。

  1. 点击 Google Cloud 控制台顶部的激活 Cloud Shell “激活 Cloud Shell”图标

  2. 在弹出的窗口中执行以下操作:

    • 继续完成 Cloud Shell 信息窗口中的设置。
    • 授权 Cloud Shell 使用您的凭据进行 Google Cloud API 调用。

如果您连接成功,即表示您已通过身份验证,且项目 ID 会被设为您的 Project_ID 。输出内容中有一行说明了此会话的 Project_ID

Your Cloud Platform project in this session is set to {{{project_0.project_id | "PROJECT_ID"}}}

gcloud 是 Google Cloud 的命令行工具。它已预先安装在 Cloud Shell 上,且支持 Tab 自动补全功能。

  1. (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
  1. 点击授权

输出:

ACTIVE: * ACCOUNT: {{{user_0.username | "ACCOUNT"}}} To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (可选)您可以通过此命令列出项目 ID:
gcloud config list project

输出:

[core] project = {{{project_0.project_id | "PROJECT_ID"}}} 注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南

设置区域和可用区

某些 Compute Engine 资源位于区域和可用区内。区域是指某个地理位置,您可以在其中运行自己的资源。每个区域包含一个或多个可用区。

在 Cloud Shell 中运行以下 Cloud Shell 命令,设置实验的默认区域和可用区:

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

场景

Pet Theory 希望自动将检验结果分享给客户。随着预约量不断增加,他们已经很难应付得过来,因此 Lily 决定向 Ruby 寻求帮助…

Lily

Lily,Pet Theory 创始人

Ruby,您好!

谢谢您解决了保险门户的问题。

我在想,医疗检验结果这一块能不能也优化一下?我们需要一种更高效的方式来将结果发送给客户。

Lily

Ruby

Ruby,软件顾问

Lily,您好!

没问题,我来想想办法。我有一些主意,或许能改善现状。

Ruby

任务 1. 架构

Pet Theory 将医疗检验业务外包给了一家外部公司。实验机构完成医疗检验后,便会将结果发回给 Pet Theory。

实验机构通过 HTTP(s) POST 将医疗实验结果发送到 Pet Theory 的 Web 端点。下图概述了总体架构。

Pet Theory 的系统架构图

在梳理了现有的业务流程后,Ruby 认为可以设计出一套系统,助力 Pet Theory 实现以下目标:

  1. 接收 HTTP POST 请求,并确认已收到医疗实验结果。
  2. 通过邮件将检验结果发送给客户。
  3. 向客户发送包含检验结果的短信和邮件。

Ruby 的设计可将上述各项活动隔离开来,并且需要以下各项:

  • 用于针对医疗结果执行请求和响应的服务
  • 用于通过邮件将检验结果发送给客户的服务
  • 用于向客户发送短信的服务
  • 用于服务间通信的 Pub/Sub
  • 用于应用架构的无服务器基础设施

通过使用一次性函数,Ruby 希望开发出更易于编写且包含更少 bug 的代码。

Ruby

Ruby,软件顾问

Patrick,您好!

Lily 希望我构建一个原型来帮助处理医疗记录。

您能不能设置一个名为 new-lab-report 的 Pub/Sub 主题,以便我开始构建?

Ruby

Patrick

Patrick,IT 管理员

Ruby,您好!

这个项目听起来很不错。我今天上午就能搞定。在 Google Cloud 上设置这两项活动非常快。

Patrick

创建 Pub/Sub 主题

帮助 Patrick 创建名为 new-lab-report 的 Pub/Sub 主题。

在架构图中突出显示的 Cloud Pub/Sub

当服务发布 Pub/Sub 消息时,相应消息必须使用主题进行标记。实验报告将由即将创建的服务进行处理,该服务会为找到的每份报告发布一条消息。

首先,您需要创建可用于此任务的主题。

  1. 运行以下命令,创建 Pub/Sub 主题:
gcloud pubsub topics create new-lab-report

凡是订阅“new-lab-report”主题的服务,都可以使用实验报告服务发布的消息。在上图中,您可以看到两种使用这类消息的服务,即邮件服务和短信服务。

  1. 然后启用 Cloud Run,在云端运行代码:
gcloud services enable run.googleapis.com

点击检查我的进度以验证是否完成了以下目标:

创建 Pub/Sub 主题

别忘了告知 Ruby 最新进展,让她知道 Pub/Sub 主题已准备就绪!

Patrick

Patrick,IT 管理员

Ruby,您好!

大功告成。

如果您有时间,我想看看这个原型是如何搭建起来的。我们能一起处理这个问题吗?

Patrick

Ruby

Ruby,软件顾问

Patrick,您好!

太好了,感谢您如此快速地处理此事。我会定个时间,然后我们就动手构建。

Ruby

任务 2. 构建实验报告服务

帮助 Ruby 设置新的实验报告服务。

在架构图中突出显示的实验报告服务

这项服务可用于设计原型,因此仅用于执行以下两项操作:

  1. 接收包含报告数据的实验报告 HTTPS POST。
  2. 在 Pub/Sub 上发布消息。

为实验报告服务添加代码

  1. 返回到 Cloud Shell,克隆本实验所需的代码库:
git clone https://github.com/rosera/pet-theory.git
  1. 前往 lab-service 目录:
cd pet-theory/lab05/lab-service
  1. 安装所需的下列软件包,以接收传入的 HTTPS 请求并将消息发布到 Pub/Sub:
npm install express npm install body-parser npm install @google-cloud/pubsub

这些命令会更新 package.json 文件,以指出此服务所需的依赖项。

现在,您要修改 package.json 文件,以便 Cloud Run 知道如何启动您的代码。

  1. 打开 package.json 文件。

  2. package.json 文件的“scripts”部分,在第 7 行添加一行代码 "start": "node index.js",(如下所示),然后保存文件:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, 注意:请务必完全按照原样添加所提供的代码,包括结尾处的英文逗号:

"start": "node index.js",

否则,您将在部署期间遇到错误。
  1. 创建一个名为 index.js 的新文件,并向其中添加以下代码:
const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const labReport = req.body; await publishPubSubMessage(labReport); res.status(204).send(); } catch (ex) { console.log(ex); res.status(500).send(ex); } }) async function publishPubSubMessage(labReport) { const buffer = Buffer.from(JSON.stringify(labReport)); await pubsub.topic('new-lab-report').publish(buffer); } 以下两行代码是该服务的核心所在:

const labReport = req.body;

await publishPubSubMessage(labReport);

具体来说,这几行代码的作用是:

  • 从 POST 请求中提取实验报告。
  • 发布 PubSub 消息,其中包含新发布的实验报告。
  1. 现在,创建一个名为 Dockerfile 的文件,并向其中添加以下代码:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

此文件定义了如何将 Cloud Run 服务打包到容器中。

部署 lab-report-service

  1. 创建一个名为 deploy.sh 的文件,并将以下命令粘贴到其中:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service gcloud run deploy lab-report-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --allow-unauthenticated \ --max-instances=1
  1. 在 Cloud Shell 中,运行以下命令,使此文件可执行:
chmod u+x deploy.sh
  1. 现在可以部署实验报告服务了!运行部署脚本:
./deploy.sh

由于时间问题,首次运行此命令时,您可能会收到错误消息。如果收到错误消息,只需重新运行 deploy.sh

部署成功完成后,您会看到类似于以下内容的消息:

Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app

干得好!实验报告服务已部署完毕,将会通过 HTTP 处理医疗实验结果。现在,您可以测试这一新服务是否已启动并正常运行。

点击检查我的进度以验证是否完成了以下目标:

部署实验报告服务:构建

点击检查我的进度以验证是否完成了以下目标:

部署实验报告服务:创建修订版本

测试实验报告服务

若要验证实验报告服务,请模拟实验机构发出的三个 HTTPS POST,每个 POST 包含一份实验报告。为了便于测试,创建的实验报告将仅包含一个 ID。

  1. 首先,将报告网址放入环境变量中,以便更轻松地处理报告。
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. 确认已捕获 LAB_REPORT_SERVICE_URL:
echo $LAB_REPORT_SERVICE_URL
  1. 创建一个名为 post-reports.sh 的新文件,并向其中添加以下代码:
curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 12}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 34}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 56}" \ $LAB_REPORT_SERVICE_URL &

上述脚本会使用 curl 命令,将三个不同的 ID 发布到实验服务网址。每个命令都将在后台单独运行。

  1. 使 post-reports.sh 脚本可执行:
chmod u+x post-reports.sh
  1. 现在,使用上述脚本将三份实验报告发布到实验报告服务端点,以对该端点进行测试:
./post-reports.sh

此脚本已将三份实验报告发布到您的实验报告服务。请检查日志以查看结果!

  1. 在 Cloud 控制台中,依次点击导航菜单 (“导航菜单”图标) > Cloud Run

  2. 现在,您应该会在服务列表中看到新部署的 lab-report-service。点击该服务。

  3. 在随即打开的页面中,您会看到有关 lab-report-service 的详细信息。点击日志标签页。

在“日志”页面上,您会看到关于自己刚刚使用脚本发布的三份检验报告的结果。希望返回的是 HTTP 代码 204,这表示已成功处理请求,但没有任何响应内容,如下所示。如果您没有看到任何条目,请尝试使用右侧的滚动条上下滚动。这会重新加载日志。

接下来的任务是编写短信服务和邮件服务。当实验报告服务使用“new-lab-report”主题发布 Pub/Sub 消息时,系统就会触发这些服务。

任务 3. 邮件服务

帮助 Ruby 设置新的邮件服务。

在架构图中突出显示的邮件服务

为邮件服务添加代码

  1. 移动到邮件服务目录:
cd ~/pet-theory/lab05/email-service
  1. 安装以下软件包,以便代码能够处理传入的 HTTPS 请求:
npm install express npm install body-parser

上述命令会更新 package.json 文件,该文件用于描述应用及其依赖项。Cloud Run 需要知道如何运行代码,因此请添加 start 指令,以便 Cloud Run 知道如何操作。

  1. 打开 package.json 文件。

  2. 在“scripts”部分,按照如下所示添加 "start": "node index.js", 这行代码,然后保存文件:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, 注意:请务必完全按照原样添加所提供的代码,包括结尾处的英文逗号:

"start": "node index.js",

否则,您将在部署期间遇到错误。
  1. 创建一个名为 index.js 的新文件,并向其中添加以下内容:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`Email Service: Report ${labReport.id} trying...`); sendEmail(); console.log(`Email Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`Email Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendEmail() { console.log('Sending email'); }

每当 Pub/Sub 向服务发布消息时,这段代码就会运行。这段代码的作用如下:

  • 对 Pub/Sub 消息进行解码,然后尝试调用 sendEmail() 函数。
  • 如果上述操作成功且没有抛出异常,服务将返回状态代码 204,以便 Pub/Sub 知道消息已被处理。
  • 如果存在异常,服务将返回状态代码 500,以便让 Pub/Sub 知道消息未被处理,稍后应将消息重新发布到服务。

服务之间正常通信后,Ruby 会在 sendEmail() 函数中添加代码,以便真正发送邮件。

  1. 现在,创建一个名为 Dockerfile 的文件,并向其中添加以下代码:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

此文件定义了如何将 Cloud Run 服务打包到容器中。

部署邮件服务

  1. 创建一个名为 deploy.sh 的新文件,并向其中添加以下内容:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service gcloud run deploy email-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. 使 deploy.sh 可执行:
chmod u+x deploy.sh
  1. 部署邮件服务:
./deploy.sh

部署完成后,您会看到类似于以下内容的消息:

Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app

此服务已成功部署。现在,您需要确保每当有可用的 Pub/Sub 消息时,都能触发邮件服务。

点击检查我的进度以验证是否完成了以下目标:

部署邮件服务:构建

点击检查我的进度以验证是否完成了以下目标:

部署邮件服务:创建修订版本

配置 Pub/Sub 以触发邮件服务

每当使用“new-lab-report”主题发布新的 Pub/Sub 消息时,都应触发邮件服务。若要完成这项任务,请配置服务账号来自动处理此服务的相关请求。

架构图突出显示了从 Cloud Pub/Sub 到邮件服务的流程

  1. 创建新的服务账号,用于触发服务来响应 Pub/Sub 消息:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

点击检查我的进度以验证是否完成了以下目标:

创建服务账号
  1. 为新服务账号授予调用邮件服务的权限:
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

接下来,指示 Pub/Sub 在有“new-lab-report”消息发布时调用短信服务。

  1. 将项目编号放入环境变量中,以便轻松访问:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

然后,允许项目创建 Pub/Sub 身份验证令牌。

  1. 运行以下代码:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. 将邮件服务的网址放入其他环境变量中:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. 确认已捕获 EMAIL_SERVICE_URL:
echo $EMAIL_SERVICE_URL
  1. 为邮件服务创建 Pub/Sub 订阅。
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

太棒了!该服务现已设置完毕,能够响应 Cloud Pub/Sub 消息了。接下来,请验证代码以确认其符合要求。

点击检查我的进度以验证是否完成了以下目标:

创建 Pub/Sub 订阅

同时测试实验报告服务和邮件服务

  1. 使用之前创建的脚本,再次将消息发布到实验报告:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 然后打开日志(导航菜单 > Cloud Run)。您将在账号中看到两项 Cloud Run 服务,即 email-servicelab-report-service

  2. 依次点击 email-service日志
    您将看到由 Pub/Sub 触发该服务后产生的运行结果。如果您没有看到预期的消息,可能需要使用滚动条上下滚动,以刷新日志。

太棒了!现在,每当 Cloud Pub/Sub 主题队列中有消息处理完毕时,邮件服务就能将相关信息写入日志!最后一项任务是编写短信服务。

任务 4. 短信服务

帮助 Ruby 设置新的短信服务。

在架构图中突出显示的短信服务

为短信服务添加代码

  1. 为短信服务创建目录:
cd ~/pet-theory/lab05/sms-service
  1. 安装所需的软件包,以接收传入的 HTTPS 请求:
npm install express npm install body-parser
  1. 打开 package.json 文件。

  2. 在“scripts”部分,按照如下所示添加 "start": "node index.js", 这行代码,然后保存文件:

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... 注意:请务必完全按照原样添加所提供的代码,包括结尾处的英文逗号:

"start": "node index.js",

否则,您将在部署期间遇到错误。
  1. 创建一个名为 index.js 的新文件,并向其中添加以下内容:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`SMS Service: Report ${labReport.id} trying...`); sendSms(); console.log(`SMS Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendSms() { console.log('Sending SMS'); }
  1. 现在,创建一个名为 Dockerfile 的文件,并向其中添加以下代码:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

此文件定义了如何将 Cloud Run 服务打包到容器中。现在,代码已创建完毕,下一步是部署服务。

部署短信服务

  1. 创建一个名为 deploy.sh 的文件,并向其中添加以下代码:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service gcloud run deploy sms-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. 使 deploy.sh 可执行:
chmod u+x deploy.sh
  1. 部署短信服务:
./deploy.sh

部署完成后,系统会显示类似于以下内容的消息:

Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app

短信服务已成功部署,但未关联到 Cloud Pub/Sub 服务。您将在下一部分中解决这个问题。

点击检查我的进度以验证是否完成了以下目标:

部署短信服务

配置 Cloud Pub/Sub 以触发短信服务

与邮件服务类似,您也需要配置 Cloud Pub/Sub 与短信服务之间的关联,以便系统能够处理消息。

架构图突出显示了从 Cloud Pub/Sub 到短信服务的流程

  1. 设置相关权限,以允许 Pub/Sub 触发短信服务:
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

接下来,指示 Pub/Sub 在“new-lab-report”消息发布时调用短信服务。

  1. 第一步,将短信服务的网址放入环境变量中:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. 确认已捕获 SMS_SERVICE_URL:

    echo $SMS_SERVICE_URL
  2. 然后创建 Pub/Sub 订阅:

gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
  1. 再次运行测试脚本,将三份实验报告发布到实验报告服务:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 然后打开日志(导航菜单 > Cloud Run)。您将在账号中看到三项 Cloud Run 服务,即 email-service、lab-report-service 和 sms-service。

  2. 依次点击 sms-service日志。您将看到由 Pub/Sub 触发该服务后产生的运行结果。

原型系统已创建完毕并成功经过测试。不过,Patrick 担心的是,作为初始验证环节的一部分,系统的“弹性”尚未得到实际测试。

任务 5. 测试系统的弹性

如果其中一项服务出现故障,会发生什么情况?Patrick 之前遇到过这种情况,因为这很常见。

帮助 Ruby 研究如何确保系统能够处理这种情况。她想要部署有问题的邮件服务版本,以测试服务出现故障时会发生什么情况。

  1. 返回 email-service 目录:
cd ~/pet-theory/lab05/email-service

在邮件服务应用中添加一些无效文本,使其出现错误。

  1. 修改 index.js,并在 sendEmail() 函数中添加 throw 行,如下所示。这会抛出异常,就像邮件服务器出现故障一样:
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

添加这段代码后,服务会在调用时崩溃。

  1. 部署这个有问题的邮件服务版本:
./deploy.sh
  1. 邮件服务部署成功完成后,请再次将数据发布到实验报告,然后密切关注 email-service 日志状态:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. 打开邮件服务日志,查看有问题的邮件服务的日志:导航菜单 > Cloud Run

  2. 如果您在账号中看到三项 Cloud Run 服务,请点击 email-service

系统正在调用邮件服务,但该服务总是崩溃。如果您在日志中向后滚动一下,便会找到根本原因:“邮件服务器出现故障”。您还可以看到,该服务返回了状态代码 500,并且 Pub/Sub 在不断重新尝试调用该服务。

如果您查看短信服务的日志,就会发现该服务已成功运行。

现在修复邮件服务应用中的错误,即可恢复该应用!

  1. 打开 index.js 文件,移除您之前输入的 throw 行,然后保存文件。

您的 index.js sendEmail 函数现在应如下所示:

function sendEmail() { console.log('Sending email'); }
  1. 部署修复后的邮件服务版本:
./deploy.sh
  1. 部署完成后,点击右上角的刷新图标。

您会看到以下内容:报告 12、34 和 56 的邮件最终是如何发送的,邮件服务返回了状态代码 204,以及 Pub/Sub 停止了调用该服务。没有数据丢失;Pub/Sub 进行了不断重试,直至最终成功。这就是稳健系统的基础!

要点总结

  1. 如果服务之间通过 Pub/Sub 进行异步通信,而不是直接相互调用,系统就会更具弹性。
  2. 得益于使用了 Pub/Sub,实验报告服务的触发机制能够独立于其他服务而存在。例如,如果客户还希望通过其他通讯服务接收实验结果,您只需添加相应服务即可,无需更新实验报告服务。
  3. Cloud Pub/Sub 已处理重试机制,服务无需进行处理。服务只需返回状态代码:成功或失败。
  4. 得益于 Pub/Sub 重试机制,如果服务出现故障,系统能够在服务恢复在线状态时自动自行“修复”。

恭喜!

在您的帮助下,Ruby 成功构建了弹性原型系统。该系统能够自动向每位客户发送邮件和短信。如果个别服务暂时出现故障,系统会实现重试机制,以免丢失任何数据。Ruby 赢得了实至名归的赞誉…

Lily

Lily,Pet Theory 创始人

Ruby,您好!

对于您的辛勤付出和卓越领导,我们不胜感激。

在极短的时间内,我们的核心系统就已彻底脱胎换骨。

我们周五会举办一个小聚会庆祝一下,如果您能作为我们的特邀嘉宾出席,那就太好了!

Lily

MelodyMelody,总经理

Ruby,您好!

Pet Theory 对您的工作给予了高度评价。您是团队的骄傲。

现在您已经完成了这项任务,我想和您谈谈在新项目中担任更高级职位的事宜。

Melody

总经理

Computer Consulting Inc.

后续步骤/了解详情

Google Cloud 培训和认证

…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。

本手册的最后更新时间:2024 年 7 月 23 日

本实验的最后测试时间:2024 年 7 月 23 日

版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

准备工作

  1. 实验会创建一个 Google Cloud 项目和一些资源,供您使用限定的一段时间
  2. 实验有时间限制,并且没有暂停功能。如果您中途结束实验,则必须重新开始。
  3. 在屏幕左上角,点击开始实验即可开始

使用无痕浏览模式

  1. 复制系统为实验提供的用户名密码
  2. 在无痕浏览模式下,点击打开控制台

登录控制台

  1. 使用您的实验凭证登录。使用其他凭证可能会导致错误或产生费用。
  2. 接受条款,并跳过恢复资源页面
  3. 除非您已完成此实验或想要重新开始,否则请勿点击结束实验,因为点击后系统会清除您的工作并移除该项目

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

一次一个实验

确认结束所有现有实验并开始此实验

使用无痕浏览模式运行实验

使用无痕模式或无痕浏览器窗口是运行此实验的最佳方式。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。