GSP1089

概览
Cloud Run functions 是 Google Cloud 的函数即服务产品。它附带高级功能集,由 Cloud Run 和 Eventarc 提供支持,可让您对性能和可伸缩性进行更高级的控制,并更好地控制函数运行时,以及来自 90 多个事件来源的触发器。
在本实验中,您将创建 Cloud Run 函数,这些函数用于响应 HTTP 调用,并由 Cloud Storage 事件和 Cloud Audit Logs 触发。您还可以部署 Cloud Run 函数的多个修订版本,并探索新设置。
有哪些新变化?
新版 Cloud Run functions 提供由 Cloud Run、Cloud Build、Artifact Registry 和 Eventarc 提供支持的增强型 FaaS 体验。
增强型基础设施
- 
更长的请求处理时间:Cloud Run 函数的运行时间可超过默认的 5 分钟限制,这样便可更轻松地运行请求时间更长的工作负载,例如处理来自 Cloud Storage 或 BigQuery 的大量数据。对于 HTTP 函数,最长为 60 分钟。对于事件驱动型函数,目前最长为 10 分钟。
- 
更大的实例:Cloud Run functions 可支持高达 16GB RAM 和 4 个 vCPU,能够承载更大内存占用、计算密集型及更高并行度的工作负载。
- 
并发:使用单个函数实例处理多达 1,000 个并发请求,可最大限度地减少冷启动,并缩短扩缩时的延迟时间。
- 
实例数下限:配置预热实例以减少冷启动,并确保应用的引导时间不会影响应用性能。
- 
流量分配:支持函数的多个版本,可在不同版本之间分配流量,还可将函数回滚到先前版本。
更广泛的事件覆盖范围及 CloudEvents 支持
- 
Eventarc 集成:Cloud Run functions 现在原生支持 Eventarc,它使用 Cloud Audit Logs 引入超过 125 个事件来源(BigQuery、Cloud SQL、Cloud Storage…)。此外,Cloud Run functions 仍然支持来自自定义来源的事件,这通过直接发布到 Cloud Pub/Sub 来实现。
- 
CloudEvents 格式:无论来源如何,所有事件驱动型函数都遵循业界标准 CloudEvents (cloudevents.io),确保提供始终如一的开发者体验。载荷通过包含 cloudevent.data 载荷的结构化 CloudEvent 发送,并实现 CloudEvents 标准。
目标
在本实验中,您将学习如何执行以下任务:
- 编写用于响应 HTTP 调用的函数。
- 编写用于响应 Cloud Storage 事件的函数。
- 编写用于响应 Cloud Audit Logs 的函数。
- 部署 Cloud Run 函数的多个修订版本。
- 使用实例数下限消除冷启动。
- 设置并发。
设置和要求
点击“开始实验”按钮前的注意事项
请阅读以下说明。实验是计时的,并且您无法暂停实验。计时器在您点击开始实验后即开始计时,显示 Google Cloud 资源可供您使用多长时间。
此实操实验可让您在真实的云环境中开展实验活动,免受模拟或演示环境的局限。为此,我们会向您提供新的临时凭据,您可以在该实验的规定时间内通过此凭据登录和访问 Google Cloud。
为完成此实验,您需要:
- 能够使用标准的互联网浏览器(建议使用 Chrome 浏览器)。
注意:请使用无痕模式(推荐)或无痕浏览器窗口运行此实验。这可以避免您的个人账号与学生账号之间发生冲突,这种冲突可能导致您的个人账号产生额外费用。
注意:请仅使用学生账号完成本实验。如果您使用其他 Google Cloud 账号,则可能会向该账号收取费用。如何开始实验并登录 Google Cloud 控制台
- 
点击开始实验按钮。如果该实验需要付费,系统会打开一个对话框供您选择支付方式。左侧是“实验详细信息”窗格,其中包含以下各项: 
- “打开 Google Cloud 控制台”按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
 
- 
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。 该实验会启动资源并打开另一个标签页,显示“登录”页面。 提示:将这些标签页安排在不同的窗口中,并排显示。 注意:如果您看见选择账号对话框,请点击使用其他账号。
- 
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。 {{{user_0.username | "<用户名>"}}}您也可以在“实验详细信息”窗格中找到“用户名”。 
- 
点击下一步。 
- 
复制下面的密码,然后将其粘贴到欢迎对话框中。 {{{user_0.password | "<密码>"}}}您也可以在“实验详细信息”窗格中找到“密码”。 
- 
点击下一步。 重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
 
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
- 
继续在后续页面中点击以完成相应操作: 
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
 
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需访问 Google Cloud 产品和服务,请点击导航菜单,或在搜索字段中输入服务或产品的名称。
 
激活 Cloud Shell
Cloud Shell 是一种装有开发者工具的虚拟机。它提供了一个永久性的 5GB 主目录,并且在 Google Cloud 上运行。Cloud Shell 提供可用于访问您的 Google Cloud 资源的命令行工具。
- 
点击 Google Cloud 控制台顶部的激活 Cloud Shell  。 。
 
- 
在弹出的窗口中执行以下操作: 
- 继续完成 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 自动补全功能。
- (可选)您可以通过此命令列出活跃账号名称:
gcloud auth list
- 点击授权。
输出:
ACTIVE: *
ACCOUNT: {{{user_0.username | "ACCOUNT"}}}
To set the active account, run:
    $ gcloud config set account `ACCOUNT`
- (可选)您可以通过此命令列出项目 ID:
gcloud config list project输出:
[core]
project = {{{project_0.project_id | "PROJECT_ID"}}}
注意:如需查看在 Google Cloud 中使用 gcloud 的完整文档,请参阅 gcloud CLI 概览指南。
任务 1. 启用 API
在创建 Cloud Run 函数之前,您需要启用相关 API。
gcloud services enable \
  artifactregistry.googleapis.com \
  cloudfunctions.googleapis.com \
  cloudbuild.googleapis.com \
  eventarc.googleapis.com \
  run.googleapis.com \
  logging.googleapis.com \
  pubsub.googleapis.com
在 Cloud Shell IDE 中启用 Gemini Code Assist
您可以在集成开发环境 (IDE)(例如 Cloud Shell)中使用 Gemini Code Assist,以获取代码方面的指导或解决代码问题。您需要先启用 Gemini Code Assist,然后才能使用该功能。
- 在 Cloud Shell 中,使用以下命令启用 Gemini for Google Cloud API:
gcloud services enable cloudaicompanion.googleapis.com
- 点击 Cloud Shell 工具栏上的打开编辑器。
注意:如需打开 Cloud Shell 编辑器,请点击 Cloud Shell 工具栏上的打开编辑器。您可以根据需要点击打开编辑器或打开终端,在 Cloud Shell 和代码编辑器之间切换。
- 
在左侧窗格中,点击设置图标,然后在设置视图中搜索 Gemini Code Assist。 
- 
找到Geminicodeassist: Enable(Geminicodeassist:启用)并确保选中了该复选框,然后关闭设置。 
- 
点击屏幕底部状态栏中的 Cloud Code - 无项目。 
- 
按照说明对插件进行授权。如果系统未自动选择项目,请点击选择 Google Cloud 项目,然后选择 。 
- 
检查您的 Google Cloud 项目 () 是否显示在状态栏的 Cloud Code 状态消息中。 
任务 2. 创建 HTTP 函数
对于第一个函数,请创建用于响应 HTTP 请求且经过身份验证的 Node.js 函数,并将超时时间设为 10 分钟,演示函数如何获得更长时间来响应 HTTP 请求。
创建
- 在 Cloud Shell 终端中,运行以下命令,为应用创建文件夹和文件,然后进入该文件夹:
mkdir ~/hello-http && cd $_
touch index.js && touch package.json
- 
在 Cloud Shell 的工具栏中点击打开编辑器按钮。 
- 
将以下代码添加到 hello-http/index.js文件中,该文件仅用于响应 HTTP 请求:
 
const functions = require('@google-cloud/functions-framework');
functions.http('helloWorld', (req, res) => {
  res.status(200).send('HTTP with Node.js in GCF 2nd gen!');
});
- 将以下内容添加到 hello-http/package.json文件中,以指定依赖项。
{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}
- 
在文件资源管理器中,打开 index.js文件。此操作会启用 Gemini Code Assist,启用后,编辑器右上角会显示 图标。 图标。
 
- 
点击 Gemini Code Assist:智能操作  图标,然后选择 Explain this(解释此内容)。 图标,然后选择 Explain this(解释此内容)。
 
- 
Gemini Code Assist 会打开一个聊天窗格,其中预填充了 Explain this提示。在 Code Assist 聊天窗格的内嵌文本框中,将预填充的提示替换为以下内容,然后点击发送:
 
You are an expert Cloud Developer at Cymbal AI. A new team member is unfamiliar with this Cloud Function implementation. Explain the "index.js" and "package.json" files within the "hello-http" folder in detail, breaking down their key components used in the application code.
For the suggested improvements, don't update these files.index.js 和 package.json 文件中代码的详细说明会显示在 Gemini Code Assist 对话中。
部署
- 在 Cloud Shell 终端中,运行以下命令来部署函数,并在未经身份验证的调用弹出式窗口中输入 y:
gcloud functions deploy nodejs-http-function \
  --gen2 \
  --runtime nodejs22 \
  --entry-point helloWorld \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-http \
  --timeout 600s \
  --max-instances 1
注意:如果遇到权限错误,请等待几分钟,然后再次尝试部署。启用 API 可能需要几分钟时间。
虽然对于此步骤并非绝对必要,但还是设置了 600 秒的超时时间。这样一来,函数就有更长的超时时间来响应 HTTP 请求。
- 部署函数后,在搜索栏中输入 Cloud Run functions,然后点击搜索结果,系统就会将您重定向到 Cloud Run 控制台。验证函数是否已成功部署。

测试
gcloud functions call nodejs-http-function \
  --gen2 --region {{{project_0.default_region|Region}}}
您应该会看到以下响应消息:
HTTP with Node.js in GCF 2nd gen!
点击检查我的进度以验证是否完成了以下目标:
创建 HTTP 函数
任务 3. 创建 Cloud Storage 函数
在本部分中,您将创建一个 Node.js 函数,用于响应 Cloud Storage 存储桶中的事件。
设置
- 如需使用 Cloud Storage 函数,请先运行以下代码,向 Cloud Storage 服务账号授予 pubsub.publisherIAM 角色:
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:{{{ project_0.project_id | PROJECT_ID }}}" --format='value(project_number)')
SERVICE_ACCOUNT=$(gsutil kms serviceaccount -p $PROJECT_NUMBER)
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT_ID }}} \
  --member serviceAccount:$SERVICE_ACCOUNT \
  --role roles/pubsub.publisher创建
- 运行以下命令,为应用创建文件夹和文件,然后进入该文件夹:
mkdir ~/hello-storage && cd $_
touch index.js && touch package.json
- 
在 Cloud Shell 的工具栏中点击打开编辑器按钮。 
- 
将以下代码添加到 hello-storage/index.js文件中,该文件仅用于响应 Cloud Storage 事件:
 
const functions = require('@google-cloud/functions-framework');
functions.cloudEvent('helloStorage', (cloudevent) => {
  console.log('Cloud Storage event with Node.js in GCF 2nd gen!');
  console.log(cloudevent);
});
- 将以下内容添加到 hello-storage/package.json文件中,以指定依赖项:
{
  "name": "nodejs-functions-gen2-codelab",
  "version": "0.0.1",
  "main": "index.js",
  "dependencies": {
    "@google-cloud/functions-framework": "^2.0.0"
  }
}
- 
在文件资源管理器中,打开“hello-storage”文件夹中的 index.js文件。此操作会启用 Gemini Code Assist,启用后,编辑器右上角会显示 图标。 图标。
 
- 
点击 Gemini Code Assist:智能操作  图标,然后选择 Explain this(解释此内容)。 图标,然后选择 Explain this(解释此内容)。
 
- 
Gemini Code Assist 会打开一个聊天窗格,其中预填充了 Explain this提示。在 Code Assist 聊天窗格的内嵌文本框中,将预填充的提示替换为以下内容,然后点击发送:
 
You are an expert Cloud Developer at Cymbal AI. A new team member is unfamiliar with this Cloud Function implementation. Explain the "index.js" and "package.json" files within the "hello-storage" folder in detail, breaking down their key components used in the application code.
For the suggested improvements, don't update these files.index.js 和 package.json 文件中代码的详细说明会显示在 Gemini Code Assist 对话中。
部署
- 首先,运行以下命令,创建用于创建事件的 Cloud Storage 存储桶:
BUCKET="gs://gcf-gen2-storage-{{{ project_0.project_id | PROJECT_ID }}}"
gsutil mb -l {{{project_0.default_region|Region}}} $BUCKET
- 运行以下命令以部署函数:
gcloud functions deploy nodejs-storage-function \
  --gen2 \
  --runtime nodejs22 \
  --entry-point helloStorage \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-bucket $BUCKET \
  --trigger-location {{{project_0.default_region|Region}}} \
  --max-instances 1
注意:与之前一样,如果遇到权限错误,请等待几分钟,然后再次尝试部署。启用 API 可能需要几分钟时间。
- 部署函数后,验证您是否可以在 Cloud Run 控制台中看到该函数。

测试
- 运行以下命令,将文件上传到存储桶以测试函数:
echo "Hello World" > random.txt
gsutil cp random.txt $BUCKET/random.txt
- 运行以下命令。您应该会在日志中看到接收到的 CloudEvent:
gcloud functions logs read nodejs-storage-function \
  --region {{{project_0.default_region|Region}}} --gen2 --limit=100 --format "value(log)"
注意:生成日志可能需要一分钟时间。您应该会看到类似如下所示的输出结果。
输出:
}
  traceparent: '00-c74cb472d1e78f7225b6f617a31d9c08-96f0380bb62be2c1-01'
  },
    etag: 'CKOx1L3wofoCEAE='
    crc32c: 'R1jUOQ==',
    mediaLink: 'https://storage.googleapis.com/download/storage/v1/b/gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb/o/random.txt?generation=1663625646643363&alt=media',
    md5Hash: '5Z/5eUEET4XfUpfhwwLSYA==',
    size: '12',
    timeStorageClassUpdated: '2022-09-19T22:14:06.657Z',
    storageClass: 'STANDARD',
    updated: '2022-09-19T22:14:06.657Z',
    timeCreated: '2022-09-19T22:14:06.657Z',
    contentType: 'text/plain',
    metageneration: '1',
    generation: '1663625646643363',
    bucket: 'gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb',
    name: 'random.txt',
    selfLink: 'https://www.googleapis.com/storage/v1/b/gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb/o/random.txt',
    id: 'gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb/random.txt/1663625646643363',
    kind: 'storage#object',
  data: {
  bucket: 'gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb',
  time: '2022-09-19T22:14:06.657124Z',
  subject: 'objects/random.txt',
  type: 'google.cloud.storage.object.v1.finalized',
  specversion: '1.0',
  source: '//storage.googleapis.com/projects/_/buckets/gcf-gen2-storage-qwiklabs-gcp-00-101b4b9ca9bb',
  id: '5693030851428996',
{
Cloud Storage event with Node.js in GCF 2nd gen!
点击检查我的进度以验证是否完成了以下目标:
创建 Cloud Storage 函数
任务 4. 创建 Cloud Audit Logs 函数
在本部分中,您将创建一个 Node.js 函数,用于在创建 Compute Engine 虚拟机实例时接收 Cloud Audit Logs 事件。在响应中,该函数会向新创建的虚拟机添加标签,用于指定虚拟机的创建者。
确定新创建的 Compute Engine 虚拟机
创建虚拟机时,Compute Engine 会发出 2 个审核日志。
第一个是在虚拟机创建开始时发出,如下所示:

第二个是在虚拟机创建完成后发出,如下所示:

请注意,operation 字段分别包含 first: true 和 last: true 值。第二个审核日志包含为实例添加标签所需的所有信息,因此您可以使用 last: true 标志在 Cloud Run 函数中检测该日志。
设置
如需使用 Cloud Audit Logs 函数,您必须为 Eventarc 启用审核日志。此外,您还需要使用具有 eventarc.eventReceiver 角色的服务账号。
- 在导航菜单中,依次前往 IAM 和管理 > 审核日志。
注意:您可以忽略缺少resourcemanager.folders.getIamPolicy 权限的警告。
- 
找到 Compute Engine API,然后点击它旁边的复选框。如果找不到该 API,请在下一页中搜索。 
- 
在右侧的信息窗格中,选中管理员读取、数据读取和数据写入日志类型对应的复选框,然后点击保存。 

- 向默认 Compute Engine 服务账号授予 eventarc.eventReceiverIAM 角色:
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT_ID }}} \
  --member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
  --role roles/eventarc.eventReceiver获取代码
- 运行以下代码,克隆包含应用的代码库:
cd ~
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
- 
在 Cloud Shell 的工具栏中点击打开编辑器按钮。 
- 
在文件资源管理器中,依次前往 eventarc-samples > gce-vm-labeler > gcf > nodejs > index.js。 
- 
打开 index.js文件。此操作会启用 Gemini Code Assist,启用后,编辑器右上角会显示 图标。 图标。
 
- 
点击 Gemini Code Assist:智能操作  图标,然后选择 Explain this(解释此内容)。 图标,然后选择 Explain this(解释此内容)。
 
- 
Gemini Code Assist 会打开一个聊天窗格,其中预填充了 Explain this提示。在 Code Assist 聊天窗格的内嵌文本框中,将预填充的提示替换为以下内容,然后点击发送:
 
You are an expert Cloud Developer at Cymbal AI. A new team member is unfamiliar with this Cloud Function implementation. Explain the "index.js" file in detail, breaking down its key components used in the application code.
For the suggested improvements, don't update the file.index.js 文件包含应用代码,该应用代码可接收封装在 CloudEvent 中的审核日志。然后,它会提取 Compute Engine 虚拟机实例详细信息,并为虚拟机实例设置标签。您可以自行深入研究 index.js 文件。
index.js 文件中代码的详细说明会显示在 Gemini Code Assist 对话中。
部署
- 在 Cloud Shell 终端中,运行以下命令以进入应用目录:
cd ~/eventarc-samples/gce-vm-labeler/gcf/nodejs
- 运行以下命令,与之前一样使用 gcloud部署函数。请注意,该函数使用--trigger-event-filters标志对 Compute Engine 插入的审核日志进行过滤:
gcloud functions deploy gce-vm-labeler \
  --gen2 \
  --runtime nodejs22 \
  --entry-point labelVmCreation \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-event-filters="type=google.cloud.audit.log.v1.written,serviceName=compute.googleapis.com,methodName=beta.compute.instances.insert" \
  --trigger-location {{{project_0.default_region|Region}}} \
  --max-instances 1
注意:虽然审核日志函数触发器会立即创建,但最长可能需要 10 分钟才能完全正常运作。点击检查我的进度以验证是否完成了以下目标:
创建 Cloud Audit Logs 函数
测试
为了测试审核日志函数,您需要在 Cloud 控制台中创建 Compute Engine 虚拟机(您也可以使用 gcloud 创建虚拟机,但这似乎不会生成审核日志)。
- 
在导航菜单中,依次前往 Compute Engine > 虚拟机实例。 
- 
点击创建实例,将实例名称设为 instance-1,将可用区设为 。 
- 
将所有其他字段保留为默认值,然后点击创建。 
虚拟机创建完成后,您应该会在 Cloud 控制台的基本信息部分中看到为虚拟机添加的 creator 标签。

- 使用以下命令进行验证:
gcloud compute instances describe instance-1 --zone {{{project_0.default_zone | "Zone"}}}您应该会在输出中看到该标签,如以下示例所示。
输出示例:
...
labelFingerprint: ULU6pAy2C7s=
labels:
  creator: student-02-19b599a0f901
...
点击检查我的进度以验证是否完成了以下目标:
创建虚拟机实例
- 运行以下命令以删除虚拟机。出现提示时,输入 Y进行确认。
gcloud compute instances delete instance-1 --zone {{{project_0.default_zone | "Zone"}}}任务 5. 部署不同的修订版本
Cloud Run functions 支持函数的多个修订版本,可让您在不同的修订版本之间分配流量,以及将函数回滚到先前版本。在本部分中,您将部署 Cloud Run 函数的两个修订版本。
创建
- 运行以下命令,为应用创建文件夹和文件,然后进入该文件夹:
mkdir ~/hello-world-colored && cd $_
touch main.py
touch requirements.txt
- 将以下代码添加到 hello-world-colored/main.py文件中,以创建 Python 函数,用于读取颜色环境变量,并返回以相应颜色为背景颜色的Hello World:
import os
color = os.environ.get('COLOR')
def hello_world(request):
    return f'<body style="background-color:{color}"><h1>Hello World!</h1></body>'部署
- 运行以下命令,部署函数的第一个修订版本(背景颜色为橙色):
COLOR=orange
gcloud functions deploy hello-world-colored \
  --gen2 \
  --runtime python39 \
  --entry-point hello_world \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-http \
  --allow-unauthenticated \
  --update-env-vars COLOR=$COLOR \
  --max-instances 1此时,如果您通过在浏览器中查看 HTTP 触发器(之前执行的部署命令的 URI 输出)来测试函数,应该会看到背景颜色为橙色的 Hello World:

- 
前往 Cloud Run functions 页面,您将被重定向到 Cloud Run 控制台,接着点击 hello-world-colored 函数。 
- 
点击修改和部署新的修订版本。 
- 
将所有设置都保留为默认值,接着向下滚动,然后选择变量和密钥标签页。在环境变量部分中,将 COLOR 环境变量更新为 yellow。
 

- 点击部署。
由于这是最新修订版本,因此如果您测试函数,应该会看到背景颜色为黄色的 Hello World:

点击检查我的进度以验证是否完成了以下目标:
部署不同的修订版本
任务 6. 设置实例数下限
在 Cloud Run functions 中,您可以指定要保持预热状态并且随时能够处理请求的函数实例数下限。这对于限制冷启动次数非常有用。在本部分中,您将部署一个初始化速度较慢的函数,观察冷启动问题,然后部署实例数下限值设为 1 的函数,以消除冷启动。
创建
- 运行以下命令,为应用创建文件夹和文件,然后进入该文件夹:
mkdir ~/min-instances && cd $_
touch main.go
touch go.mod
- 将以下代码添加到 min-instances/main.go文件中。这项 Go 服务具有init函数,该函数会休眠 10 秒钟,以模拟时间较长的初始化。它还有一个用于响应 HTTP 调用的HelloWorld函数:
package p
import (
        "fmt"
        "net/http"
        "time"
)
func init() {
        time.Sleep(10 * time.Second)
}
func HelloWorld(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Slow HTTP Go in GCF 2nd gen!")
}
- 将以下代码添加到 min-instances/go.mod文件中。这段代码用于指定模块路径和 Go 语言版本:
module example.com/mod
go 1.23部署
- 运行以下命令,部署函数的第一个修订版本(默认实例数下限值为 0):
gcloud functions deploy slow-function \
  --gen2 \
  --runtime go123 \
  --entry-point HelloWorld \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-http \
  --allow-unauthenticated \
  --max-instances 4
- 使用以下命令测试函数:
gcloud functions call slow-function \
  --gen2 --region {{{project_0.default_region|Region}}}您应该会观察到,第一次调用会出现 10 秒延迟(冷启动),然后才显示消息。后续调用应该会立即获得结果。
Slow HTTP Go in GCF 2nd gen!
设置实例数下限
为了消除第一次请求的冷启动,请按照以下步骤重新部署函数,并将 --min-instances 标志设为 1:
- 
前往控制台中的 Cloud Run 页面,然后点击 slow-function 服务。 
- 
点击修改和部署新的修订版本。 
- 
在修订版本的扩缩配置部分下,将实例数下限设为 1,将实例数上限设为4。
 
- 
将其余字段保留为默认值,然后点击部署。 
测试
gcloud functions call slow-function \
  --gen2 --region {{{project_0.default_region|Region}}}
第一次请求应该不会再出现 10 秒延迟。由于设置了实例数下限,第一次调用(在长时间没有调用之后)的冷启动问题已得到解决!如需了解详情,请参阅使用实例数下限文档。
点击检查我的进度以验证是否完成了以下目标:
设置实例数下限
任务 7. 创建具有并发处理能力的函数
在 Cloud Run functions 中,函数实例默认处理一个并发请求,但您可以指定实例可以同时处理的并发请求数。这对于防止冷启动也很有用,因为无需为每个并行请求创建新的函数实例。
在本部分中,您将使用上一步中初始化速度较慢的函数。您向其发送 10 个请求,便会再次观察到冷启动问题,因为需要创建新的函数实例来处理这些请求。
为了解决冷启动问题,您可以再部署一个将并发值设为 100 的函数。您将观察到,这 10 个请求现在不会再引发冷启动问题,而且单个函数实例可以处理所有请求。
测试(不使用并发)
- 使用以下安装命令在 Cloud Shell 中安装 hey:
sudo apt install hey
- 运行以下命令,获取函数的网址,并将其保存为环境变量:
SLOW_URL=$(gcloud functions describe slow-function --region {{{project_0.default_region|Region}}} --gen2 --format="value(serviceConfig.uri)")
- 使用名为 hey的开源基准测试工具向初始化速度较慢的函数发送 10 个并发请求。
hey -n 10 -c 10 $SLOW_URL您应该会在 hey 的输出中看到,某些请求的处理用时较长。
输出:
Summary:
  Total:        10.9053 secs
  Slowest:      10.9048 secs
  Fastest:      0.4439 secs
  Average:      9.7930 secs
  Requests/sec: 0.9170
  Total data:   310 bytes
  Size/request: 31 bytes
Response time histogram:
  0.444 [1]     |■■■■
  1.490 [0]     |
  2.536 [0]     |
  3.582 [0]     |
  4.628 [0]     |
  5.674 [0]     |
  6.720 [0]     |
  7.767 [0]     |
  8.813 [0]     |
  9.859 [0]     |
  10.905 [9]    |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
这是因为需要创建更多函数实例来处理请求。如果您查看函数的活跃实例数,应该还会看到在某个时间点创建了多个实例,正是这些实例引发了冷启动问题。

- 运行以下命令以删除函数。出现提示时,输入 Y进行确认。
gcloud run services delete slow-function --region {{{project_0.default_region | "Region"}}}部署
- 运行以下命令,部署与之前函数相同的新函数。部署完成后,您可以增加并发数:
gcloud functions deploy slow-concurrent-function \
  --gen2 \
  --runtime go123 \
  --entry-point HelloWorld \
  --source . \
  --region {{{project_0.default_region|Region}}} \
  --trigger-http \
  --allow-unauthenticated \
  --min-instances 1 \
  --max-instances 4设置并发
现在,您将函数的底层 Cloud Run 服务的并发数设为 100(最高可设为 1,000)。这样可确保单个函数实例至少可以处理 100 个请求。
- 
在导航菜单中,前往 Cloud Run。 
- 
点击 slow-concurrent-function 服务。 
- 
点击修改和部署新的修订版本。 
- 
在资源部分下,将 CPU 设为 1。
 
- 
在请求下,将每个实例的并发请求数上限设为 100。
 
- 
在修订版本的扩缩配置下,将实例数上限设为 4。
 
- 
将其余字段保留为默认值,然后点击部署。 
测试(使用并发)
- 部署函数后,运行以下命令,获取新函数的网址,并将其保存为环境变量:
SLOW_CONCURRENT_URL=$(gcloud functions describe slow-concurrent-function --region {{{project_0.default_region|Region}}} --gen2 --format="value(serviceConfig.uri)")
- 现在,使用 hey发送 10 个并发请求:
hey -n 10 -c 10 $SLOW_CONCURRENT_URL您应该会在 hey 的输出中看到,所有请求都得到了快速处理。
输出:
Summary:
  Total:        0.0652 secs
  Slowest:      0.0651 secs
  Fastest:      0.0619 secs
  Average:      0.0636 secs
  Requests/sec: 153.3751
  Total data:   280 bytes
  Size/request: 28 bytes
Response time histogram:
  0.062 [1]     |■■■■■■■■■■■■■■■■■■■■
  0.062 [1]     |■■■■■■■■■■■■■■■■■■■■
  0.063 [0]     |
  0.063 [0]     |
  0.063 [0]     |
  0.063 [1]     |■■■■■■■■■■■■■■■■■■■■
  0.064 [2]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.064 [2]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.064 [2]     |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
  0.065 [0]     |
  0.065 [1]     |■■■■■■■■■■■■■■■■■■■■
增加并发数之后,单个函数实例就能够处理所有请求,冷启动问题也随之消失了!如需了解详情,请参阅并发文档。
点击检查我的进度以验证是否完成了以下目标:
创建具有并发处理能力的函数
恭喜!
在本实验中,您部署了多个 Cloud Run 函数,这些函数用于响应 HTTP 调用、Cloud Storage 事件和 Cloud Audit Logs。然后,您部署了运行函数的 Cloud Run 服务的多个修订版本,并设置了并发值,还通过实例数下限消除了冷启动。
后续步骤/了解详情
如需详细了解 Cloud Run functions,请探索以下内容:
Google Cloud 培训和认证
…可帮助您充分利用 Google Cloud 技术。我们的课程会讲解各项技能与最佳实践,可帮助您迅速上手使用并继续学习更深入的知识。我们提供从基础到高级的全方位培训,并有点播、直播和虚拟三种方式选择,让您可以按照自己的日程安排学习时间。各项认证可以帮助您核实并证明您在 Google Cloud 技术方面的技能与专业知识。
本手册的最后更新时间:2025 年 8 月 19 日
本实验的最后测试时间:2025 年 10 月 13 日
版权所有 2025 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。