将 Cloud Run 与 Firebase Hosting 搭配使用,可生成并提供动态内容,或者构建 REST API 作为微服务。
使用 Cloud Run,您可以部署封装在容器映像中的应用。然后,您可以使用 Firebase Hosting 来定向 HTTPS 请求,以触发容器化应用。
- Cloud Run 支持多种语言(包括 Go、Node.js、Python 和 Java),让您可以灵活选择编程语言和框架。
- Cloud Run 可以对您的容器映像进行自动横向扩容以处理收到的请求,并在需求减少时缩容。
- 您只需为在处理请求期间消耗的 CPU、内存和网络资源付费。
如需查看与 Firebase Hosting 集成的 Cloud Run 的使用场景和示例,请访问我们的无服务器概览。
本指南将介绍如何执行以下操作:
请注意,为改善提供动态内容时的性能,您可以选择调整缓存设置。
准备工作
使用 Cloud Run 之前,您需要完成一些初始任务,包括设置 Cloud Billing 账号、启用 Cloud Run API 以及安装 gcloud
命令行工具。
为您的项目设置结算功能
Cloud Run 提供免费用量配额,但您仍必须拥有与您的 Firebase 项目关联的 Cloud Billing 账号,才能使用或试用 Cloud Run。
启用 API 并安装 SDK
在 Google API 控制台中启用 Cloud Run API:
在 Google API 控制台中打开 Cloud Run API 页面。
出现提示时,选择您的 Firebase 项目。
点击 Cloud Run API 页面上的启用。
安装并初始化 Cloud SDK。
确认
gcloud
工具已配置为关联到正确的项目:gcloud config list
第 1 步:编写示例应用
请注意,除了以下示例中显示的语言之外,Cloud Run 还支持多种其他语言。
Go
新建一个名为
helloworld-go
的目录,然后切换到此目录:mkdir helloworld-go
cd helloworld-go
新建一个名为
helloworld.go
的文件,然后添加以下代码:这些代码会创建一个基本 Web 服务器,监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,可以进行容器化并上传到 Artifact Registry。
Node.js
新建一个名为
helloworld-nodejs
的目录,然后切换到此目录:mkdir helloworld-nodejs
cd helloworld-nodejs
创建一个包含以下内容的
package.json
文件:新建一个名为
index.js
的文件,然后添加以下代码:这些代码会创建一个基本 Web 服务器,监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,可以进行容器化并上传到 Artifact Registry。
Python
新建一个名为
helloworld-python
的目录,然后切换到此目录:mkdir helloworld-python
cd helloworld-python
新建一个名为
app.py
的文件,然后添加以下代码:这些代码会创建一个基本 Web 服务器,监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,可以进行容器化并上传到 Artifact Registry。
Java
安装 Java SE 8 或更高版本的 JDK 和 CURL。
请注意,我们只需执行此操作,即可在下一步中创建新的 Web 项目。后面介绍的 Dockerfile 会将所有依赖项加载到容器中。
在控制台中,依次使用 cURL 和 unzip 命令,新建一个空 Web 项目:
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d name=helloworld \ -d artifactId=helloworld \ -o helloworld.zip
unzip helloworld.zip
这将创建一个 SpringBoot 项目。
更新
src/main/java/com/example/helloworld/HelloworldApplication.java
中的SpringBootApplication
类,具体做法是添加@RestController
以处理/
映射,同时添加@Value
字段以提供TARGET
环境变量:这些代码会创建一个基本 Web 服务器,监听由
PORT
环境变量定义的端口。
您的应用已编写完毕,可以进行容器化并上传到 Artifact Registry。
第 2 步:将应用容器化并上传到 Artifact Registry
在源文件所在的目录中新建一个名为
Dockerfile
的文件,对示例应用进行容器化。将以下内容复制到您的文件中。Go
Node.js
Python
Java
在包含 Dockerfile 的目录中运行以下命令,使用 Cloud Build 构建容器映像:
gcloud builds submit --tag gcr.io/PROJECT_ID/helloworld
成功完成后,您将看到一条包含映像名称
(gcr.io/PROJECT_ID/helloworld
) 的 SUCCESS 消息。
容器映像现在存储在 Artifact Registry 中,可以根据需要重复使用。
请注意,除了使用 Cloud Build,您也可以使用本地安装的 Docker 版本在本地构建容器。
第 3 步:将容器映像部署到 Cloud Run
使用以下命令进行部署:
gcloud run deploy --image gcr.io/PROJECT_ID/helloworld
当系统提示时:
- 选择区域(例如
us-central1
) - 确认服务名称(例如
helloworld
) - 回复
Y
以允许未经身份验证的调用
- 选择区域(例如
请等待部署完成。成功完成时,命令行会显示服务网址。例如:
。https://helloworld-RANDOM_HASH-us-central1.a.run.app 在网络浏览器中打开该服务网址,访问部署的容器。
下一步会向您介绍如何通过 Firebase Hosting 网址访问此容器化应用,以便它为 Firebase 托管的网站生成动态内容。
第 4 步:将 Hosting 收到的请求定向到您的容器化应用
通过重写规则,您可以将与特定格式匹配的请求定向到单个目标。
以下示例说明如何定向来自您的 Hosting 网站上 /helloworld
页面的所有请求,以触发 helloworld
容器实例的启动和运行。
请确保:
您已初始化 Firebase Hosting。
如需详细了解如何安装 CLI 和初始化 Hosting,请参阅 Hosting 入门指南。
打开您的
firebase.json
文件。在
hosting
部分下添加以下rewrite
配置:"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/helloworld", "run": { "serviceId": "helloworld", // "service name" (from when you deployed the container image) "region": "us-central1", // optional (if omitted, default is us-central1) "pinTag": true // optional (see note below) } } ] }
在项目的根目录中运行以下命令,将 Hosting 的配置部署到您的网站:
firebase deploy --only hosting
现在,您可以通过以下网址访问容器:
您的 Firebase 子网域:
PROJECT_ID.web.app/
和PROJECT_ID.firebaseapp.com/
任何关联的自定义网域:
CUSTOM_DOMAIN/
如需详细了解重写规则,请访问 Hosting 配置页面。您还可以了解各种 Hosting 配置的响应的优先级顺序。
在本地测试
开发期间,您可以在本地运行和测试容器映像。有关详细说明,请访问 Cloud Run 文档。
后续步骤
在遍布全球的 CDN 上为动态内容设置缓存。
使用 Firebase Admin SDK 与其他 Firebase 服务进行交互。
详细了解 Cloud Run,包括有关如何设置、管理和配置容器的详细方法指南。