EdgeOne Makers Cloud Functions 基础
Edge Functions 处理轻量逻辑很在行,但遇到要装第三方库、访问数据库、做复杂计算的场景就不够用了。Cloud Functions 就是为这类”重活”准备的,它跑在中心机房,提供完整的运行时环境。这一篇讲 Cloud Functions 的基础概念、运行时环境和函数触发方式。
Cloud Functions 是什么
Cloud Functions 是跑在中心机房里的 Serverless 函数。和 Edge Functions 最大的区别在于,它提供完整的运行时环境。Node.js、Python、Go 这些语言的原生特性都能用,npm install、pip install 装的依赖包也没限制。
和 Edge Functions 的对比可以回看Functions 概览,这里用一张更细的表来说明。
| 对比维度 | Edge Functions | Cloud Functions |
|---|---|---|
| 运行时 | 类 Web API 的轻量环境 | 完整的 Node.js/Python/Go |
| 包管理 | 不支持,代码要尽量小 | 支持 npm/pip/go mod |
| 执行时间上限 | 通常几十秒 | 可到几分钟甚至更长 |
| 内存 | 较小 | 更大,可配置 |
| 文件系统 | 基本不可用 | 有临时文件系统 |
| 网络连接 | 受限,只能出站 HTTP | 几乎无限制 |
一句话: Edge Functions 是”快进快出”,Cloud Functions 是”正经干活”。
运行时环境
EdgeOne Makers 目前支持三种运行时: Node.js、Python 和 Go。不同运行时的版本和支持情况如下。
| 运行时 | 默认版本 | 可选版本 | 包管理 |
|---|---|---|---|
| Node.js | 18.x | 16.x, 20.x | npm (package.json) |
| Python | 3.11 | 3.9, 3.10 | pip (requirements.txt) |
| Go | 1.21 | 无 | go mod |
创建函数时选择运行时,后续代码、依赖、构建方式都跟着运行时走。具体每种运行时的开发细节在Node.js、Python、Go这三篇里分别讲,这里先搞懂通用的概念。
函数结构
不管用哪种语言,Cloud Functions 的基本结构是一样的: 你定义一个入口函数,平台在触发条件满足时调用它。
以 Node.js 为例,最简单的结构如下。
// index.js
exports.main = async function(event, context) {
// event 包含触发函数的信息,比如 HTTP 请求的内容
// context 包含运行环境信息,比如函数名、请求 ID
return {
statusCode: 200,
body: JSON.stringify({ message: 'Hello from Cloud Function' })
};
};
Python 版本。
# index.py
def main_handler(event, context):
"""
event: 触发事件的信息
context: 运行上下文
"""
return {
"statusCode": 200,
"body": { "message": "Hello from Cloud Function" }
}
Go 版本。
// index.go
package main
import (
"context"
"encoding/json"
)
type Response struct {
StatusCode int `json:"statusCode"`
Body string `json:"body"`
}
func MainHandler(ctx context.Context, event json.RawMessage) (*Response, error) {
body, _ := json.Marshal(map[string]string{
"message": "Hello from Cloud Function",
})
return &Response{
StatusCode: 200,
Body: string(body),
}, nil
}
三种语言的结构对比。
| 要素 | Node.js | Python | Go |
|---|---|---|---|
| 入口函数名 | main | main_handler | MainHandler |
| 第一个参数 | event | event | event |
| 第二个参数 | context | context | ctx |
| 返回值 | 对象或 Promise | 字典 | (*Response, error) |
函数触发方式
Cloud Functions 不是自己监听端口的,而是由平台在特定条件满足时触发执行。触发方式主要有以下几种。
HTTP 触发
最常见的方式。函数绑定一个 URL 路径,有请求打到这个路径时函数就执行。
用户请求 → EdgeOne 边缘节点 → 转发到 Cloud Functions → 函数执行返回响应
在控制台配置时,选择”API 网关触发”或者”HTTP 路径触发”,指定路径规则就行。
定时器触发
类似 cron 定时任务,按设定的时间间隔自动执行函数。比如每天凌晨 3 点清理过期数据、每 5 分钟检查一次服务状态。
定时器 → 触发 Cloud Functions → 函数执行
时间表达式用标准的 cron 语法。
| 表达式 | 含义 |
|---|---|
0 0 3 * * * * |
每天凌晨 3 点 |
0 */5 * * * * * |
每 5 分钟 |
0 0 9 ? * MON-FRI |
工作日每天早上 9 点 |
事件触发
其他云服务产生的事件也可以触发 Cloud Functions。比如对象存储里有新文件上传了,消息队列里有新消息了,这些事件都能配置成触发条件。
手动触发
在控制台里点一下”测试”按钮,或者通过命令行工具调用,也能手动触发函数执行。调试阶段用得最多。
函数配置
创建函数时和创建完之后,都可以调整以下配置。
| 配置项 | 说明 | 常见值 |
|---|---|---|
| 运行时 | 选 Node.js/Python/Go | Node.js 18 |
| 内存 | 函数可用的内存大小 | 128MB, 256MB, 512MB |
| 超时时间 | 函数最长执行多久 | 3s, 10s, 60s |
| 环境变量 | 函数代码里可以读取的配置值 | API_KEY, DB_HOST |
| 并发数 | 同时执行多少个实例 | 根据计费套餐不同 |
内存和超时时间要根据实际场景调。内存太小会 OOM(内存溢出),超时太短任务还没跑完就被杀了。
日志和调试
函数执行时的 console.log(Node.js)、print(Python)、fmt.Println(Go)输出都会被平台收集,在控制台的”日志查询”模块里可以看到。
调试流程一般是这样的。
本地编写代码
↓
本地测试(用模拟的 event 和 context)
↓
部署到线上
↓
控制台查看日志
↓
根据日志修复问题
↓
重新部署
小问题可以直接在控制台的在线编辑器里改,改完立刻部署。大改动还是建议本地开发好再推上去。
速查卡片
| 要点 | 说明 |
|---|---|
| Cloud Functions 定位 | 中心机房运行,完整运行时,处理重计算任务 |
| 支持的运行时 | Node.js、Python、Go |
| 入口函数 | Node.js 用 main,Python 用 main_handler,Go 用 MainHandler |
| HTTP 触发 | 绑定 URL 路径,有请求就执行 |
| 定时器触发 | cron 表达式,定时自动执行 |
| 事件触发 | 由其他云服务的事件触发 |
| 环境变量 | 控制台配置,代码里读取,不要硬编码敏感信息 |
| 日志查看 | 控制台”日志查询”模块,标准输出会被收集 |