HTTP 云函数路由
基于 @cloudbase/functions-framework 框架可以将一个大函数拆分成多个子函数,并通过请求路径将不同的请求路由到不同的处理函数
为什么需要函数路由
传统的云函数开发模式中,每个函数都需要独立部署和运行,这会带来以下问题:
- 资源浪费:每个函数独占一个实例,即使请求量很小也需要保持运行
- 冷启动频繁:多个函数意味着更多的冷启动次数
- 部署复杂:需要分别部署和管理多个函数
- 成本较高:更多的实例数量带来更高的资源成本
使用函数路由可以解决这些问题:
- 资源共享:多个函数共享同一实例,充分利用计算资源
- 降低成本:减少实例数量 ,降低冷启动次数
- 简化部署:一次部署多个函数,统一管理
- 提升性能:共享内存和连接池等资源,提高响应速度
前置条件
使用函数路由功能需要安装 @cloudbase/functions-framework 依赖:
npm install @cloudbase/functions-framework
该框架提供了函数加载、路由分发、请求处理等核心能力。
快速开始
第一步:创建项目结构
创建一个支持多函数的项目目录:
my-functions/
├── package.json # 项目配置
├── scf_bootstrap # 启动脚本
├── cloudbase-functions.json # 函数路由配置(关键)
├── index.js # 默认函数入口
├── user/ # user 函数目录
│ └── index.js
└── order/ # order 函数目录
└── index.js
第二步:创建函数代码
默认函数(index.js):
exports.main = function (event, context) {
return {
message: 'Hello from default function',
path: context.httpContext.url,
};
};
user 函数(user/index.js):
exports.main = function (event, context) {
return {
message: 'User API',
path: context.httpContext.url,
method: context.httpContext.httpMethod,
};
};
order 函数(order/index.js):
exports.main = function (event, context) {
return {
message: 'Order API',
path: context.httpContext.url,
};
};
第三步:配置函数路由
创建 cloudbase-functions.json 配置文件:
{
"functionsRoot": ".",
"functions": [
{
"name": "default",
"directory": "."
},
{
"name": "user",
"directory": "user",
"triggerPath": "/api/user" // triggerPath 是 routes 的简化写法,可以直接在函数定义中指定触发路径
},
{
"name": "order",
"directory": "order",
"triggerPath": "/api/order"
}
],
"routes": [
{
"functionName": "echo",
"path": "/echo"
}
]
}
第四步:配置 package.json
{
"name": "my-functions",
"version": "1.0.0",
"main": "index.js",
"dependencies": {
"@cloudbase/functions-framework": "latest"
}
}
第五步:创建启动脚本
创建 scf_bootstrap 文件(无扩展名):
#!/bin/bash
node node_modules/@cloudbase/functions-framework/bin/tcb-ff.js \
--port=9000 \
--logDirname=/tmp/logs \
--interceptOutput=false \
--extendedContextKey=X-Cloudbase-Context \
--functionsConfigFile=cloudbase-functions.json
⚠️ 重要:
scf_bootstrap文件需要具有可执行权限。在 Linux/macOS 系统中使用chmod +x scf_bootstrap命令设置权限。
启动参数说明:
| 参数 | 说明 | 默认值 |
|---|---|---|
--port | 函数监听端口 | 9000 |
--logDirname | 日志存储目录 | /tmp/logs |
--interceptOutput | 是否拦截标准输出 | false |
--extendedContextKey | 扩展上下文请求头键名 | X-Cloudbase-Context |
--functionsConfigFile | 函数路由配置文件路径 | cloudbase-functions.json |
第六步:安装依赖
npm install