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 \
cloudquotas.googleapis.com \
monitoring.googleapis.com
任务 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"
}
}
部署
- 在 Cloud Shell 终端中,运行以下命令来部署函数:
gcloud run deploy nodejs-http-function \
--source . \
--function helloWorld \
--base-image {{{project_0.startup_script.node_gcp_runtime | node_gcp_runtime}}} \
--region {{{project_0.default_region|Region}}} \
--timeout 600s \
--max-instances 1 \
--no-allow-unauthenticated
注意:如果出现 permissions error,请等待几分钟,然后再次尝试部署。API 需要几分钟时间才能启用。
此命令中使用的标志包括:
-
--source .:指示 Cloud Run 使用 buildpack 将函数构建到容器映像中。
-
--function helloWorld:设置要调用的函数入口点。
-
--base-image {{{project_0.startup_script.node_gcp_runtime | node_gcp_runtime}}}:指定运行时基础映像,并启用基础映像自动更新以进行安全修复。
-
--timeout 600s:允许函数有更长的超时时间(600 秒)来响应 HTTP 请求。
-
--max-instances 1:将实例数上限设置为 1。
-
--no-allow-unauthenticated:确保函数需要身份验证。
- 函数部署完成后,在 Google Cloud 控制台导航菜单中,前往 Cloud Run,并验证
nodejs-http-function 是否已列出。

测试
- 在 Cloud Shell 中,检索函数的服务网址并将其存储在环境变量中:
SERVICE_URL="$(gcloud run services describe nodejs-http-function --region {{{project_0.default_region|Region}}} --format 'value(status.url)')"
- 通过在授权标头中传递身份令牌,测试经过身份验证的 HTTP 函数:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" $SERVICE_URL
您应该会看到以下响应消息:
HTTP with Node.js in GCF 2nd gen!
点击检查我的进度以验证是否完成了以下目标:
创建 HTTP 函数
任务 3. 创建 Cloud Storage 函数
在本部分中,您将创建一个 Node.js 函数,通过 Eventarc 触发器来响应来自 Cloud Storage 存储桶的事件。
设置
- 运行以下命令,向 Cloud Storage 和 Compute Engine 服务账号授予必要的 IAM 角色:
PROJECT_NUMBER=$(gcloud projects list --filter="project_id:{{{ project_0.project_id | PROJECT_ID }}}" --format='value(project_number)')
SERVICE_ACCOUNT=$(gcloud storage service-agent --project="$PROJECT_NUMBER" | xargs)
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT_ID }}} \
--member serviceAccount:$SERVICE_ACCOUNT \
--role roles/pubsub.publisher
gcloud projects add-iam-policy-binding {{{ project_0.project_id | PROJECT_ID }}} \
--member serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role roles/eventarc.eventReceiver
创建
- 运行以下命令,为应用创建文件夹和文件,然后进入该文件夹:
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"
}
}
部署
- 首先,运行以下命令,创建用于生成事件的 Cloud Storage 存储桶:
export BUCKET_NAME="gcf-gen2-storage-{{{ project_0.project_id | PROJECT_ID }}}"
gcloud storage buckets create gs://$BUCKET_NAME --location={{{project_0.default_region|Region}}}
- 运行以下命令以部署 Cloud Run 函数:
gcloud run deploy nodejs-storage-function \
--source . \
--function helloStorage \
--base-image {{{project_0.startup_script.node_gcp_runtime | node_gcp_runtime}}} \
--region {{{project_0.default_region|Region}}} \
--max-instances 1 \
--no-allow-unauthenticated
注意:与之前一样,如果出现 permissions error,请等待几分钟,然后再次尝试部署。启用 API 可能需要几分钟时间。
- 现在,创建 Eventarc 触发器,将 Cloud Storage 对象创建事件路由到您已部署的函数:
gcloud eventarc triggers create nodejs-storage-function-trigger \
--location={{{project_0.default_region|Region}}} \
--destination-run-service=nodejs-storage-function \
--destination-run-region={{{project_0.default_region|Region}}} \
--event-filters="type=google.cloud.storage.object.v1.finalized" \
--event-filters="bucket=$BUCKET_NAME" \
--service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
- 函数和触发器部署完成后,验证您是否可以在 Cloud Run 控制台中看到
nodejs-storage-function。

测试
- 运行以下命令,将文件上传到存储桶以测试函数:
echo "Hello World" > random.txt
gcloud storage cp random.txt gs://$BUCKET_NAME/random.txt
- 运行以下命令以读取服务日志。您应该会在日志中看到接收到的 CloudEvent:
gcloud run services logs read nodejs-storage-function \
--region {{{project_0.default_region|Region}}} --limit=100
注意:生成日志可能需要一分钟时间。
您应该会看到类似如下所示的输出结果。
输出:
}
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 functions 中检测该日志。
设置
如需使用 Cloud Audit Logs 函数,您必须为 Eventarc 启用审核日志。此外,您还需要使用具有 eventarc.eventReceiver 角色的服务账号。
- 在导航菜单中,依次前往 IAM 和管理 > 审核日志。
注意:您可以忽略缺少 resourcemanager.folders.getIamPolicy 权限的警告。
-
找到 Compute Engine API,然后点击它旁边的复选框。如果找不到该 API,请在下一页中搜索。
-
在右侧的信息窗格中,选中管理员读取、数据读取和数据写入日志类型对应的复选框,然后点击保存。

- 向默认 Compute Engine 服务账号授予
eventarc.eventReceiver IAM 角色:
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 文件包含应用代码,该应用代码可接收封装在 CloudEvent 中的审核日志。然后,它会提取 Compute Engine 虚拟机实例详细信息,并为虚拟机实例设置标签。您可以自行深入研究 index.js 文件。
部署
- 在 Cloud Shell 终端中,运行以下命令以进入应用目录:
cd ~/eventarc-samples/gce-vm-labeler/gcf/nodejs
- 运行以下命令以部署 Cloud Run 函数:
gcloud run deploy gce-vm-labeler \
--source . \
--function labelVmCreation \
--base-image {{{project_0.startup_script.node_gcp_runtime | node_gcp_runtime}}} \
--region {{{project_0.default_region|Region}}} \
--max-instances 1 \
--no-allow-unauthenticated
- 创建 Eventarc 触发器,以过滤 Compute Engine 实例插入操作的审核日志:
gcloud eventarc triggers create gce-vm-labeler-trigger \
--location={{{project_0.default_region|Region}}} \
--destination-run-service=gce-vm-labeler \
--destination-run-region={{{project_0.default_region|Region}}} \
--event-filters="type=google.cloud.audit.log.v1.written" \
--event-filters="serviceName=compute.googleapis.com" \
--event-filters="methodName=beta.compute.instances.insert" \
--service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com
注意:尽管审核日志函数触发器会立即创建,但最长可能需要等待 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 run deploy hello-world-colored \
--source . \
--function hello_world \
--base-image python311 \
--region {{{project_0.default_region|Region}}} \
--allow-unauthenticated \
--update-env-vars COLOR=$COLOR \
--max-instances 1
此时,如果您通过在浏览器中打开服务网址(之前执行的部署命令的 URI 输出)来测试函数,应该会看到背景颜色为橙色的 Hello World:

-
前往控制台中的 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.26
部署
- 运行以下命令,部署函数的第一个修订版本(默认实例数下限值为 0):
gcloud run deploy slow-function \
--source . \
--function HelloWorld \
--base-image go126 \
--region {{{project_0.default_region|Region}}} \
--allow-unauthenticated \
--max-instances 4
- 运行以下命令来测试函数:
SLOW_URL="$(gcloud run services describe slow-function --region {{{project_0.default_region|Region}}} --format 'value(status.url)')"
curl $SLOW_URL
您应该会观察到,第一次调用会出现 10 秒延迟(冷启动),然后才显示消息。后续调用应当会立即返回结果:
Slow HTTP Go in GCF 2nd gen!
设置实例数下限
为了消除第一次请求的冷启动,请按照以下步骤重新部署函数,并将 --min-instances 标志设为 1:
-
前往控制台中的 Cloud Run 页面,然后点击 slow-function 服务。
-
点击修改和部署新的修订版本。
-
在修订版本的扩缩配置部分下,将实例数下限设为 1,并将实例数上限设为 4。
-
将其余字段保留为默认值,然后点击部署。
测试
curl $SLOW_URL
第一次请求应该不会再出现 10 秒延迟。由于设置了实例数下限,第一次调用(在长时间没有调用之后)的冷启动问题已得到解决!如需了解详情,请参阅使用实例数下限文档。
点击检查我的进度以验证是否完成了以下目标:
设置实例数下限
任务 7. 创建具有并发处理能力的函数
在 Cloud Run functions 中,一个函数实例默认处理一个并发请求,但您可以指定实例可以同时处理的并发请求数。这对于防止冷启动也很有用,因为无需为每个并行请求创建新的函数实例。
在本部分中,您将使用上一步中初始化速度较慢的函数。您向其发送 10 个请求,便会再次观察到冷启动问题,因为需要创建新的函数实例来处理这些请求。
为了解决冷启动问题,您可以再部署一个将并发值设为 100 的函数。您将观察到,这 10 个请求现在不会再引发冷启动问题,而且单个函数实例可以处理所有请求。
测试(不使用并发)
- 使用以下命令在 Cloud Shell 中安装
hey:
sudo apt install hey
- 运行以下命令,获取函数的网址,并将其保存为环境变量:
SLOW_URL=$(gcloud run services describe slow-function --region {{{project_0.default_region|Region}}} --format="value(status.url)")
- 使用名为
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 run deploy slow-concurrent-function \
--source . \
--function HelloWorld \
--base-image go126 \
--region {{{project_0.default_region|Region}}} \
--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 run services describe slow-concurrent-function --region {{{project_0.default_region|Region}}} --format="value(status.url)")
- 现在,使用
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 技术方面的技能与专业知识。
上次更新手册的时间:2026 年 8 月 19 日
上次测试实验的时间:2026 年 8 月 19 日
版权所有 2026 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。