3. Serverless 平台架构:函数计算、API 网关、事件驱动、弹性伸缩核心组件
Serverless 平台并非单一产品,而是由多个核心组件协同构成的分布式系统。理解这些组件的职责与交互关系,是设计灰度发布、弹性伸缩与日志留痕方案的基础。本章聚焦四大核心组件:函数计算(FaaS)、API 网关(API Gateway)、事件驱动(Event-Driven)与弹性伸缩(Auto Scaling),并剖析其在发布流水线中的关键作用。
3.1 核心组件架构总览
下图展示了 Serverless 平台的核心组件及其在请求生命周期中的协作关系。从客户端请求到函数执行,再到日志持久化,每个组件都承担着不可替代的职责。
3.2 函数计算(FaaS)—— 执行核心
函数计算是 Serverless 平台的计算载体,负责运行用户代码。在灰度发布场景中,函数计算需要支持版本管理与别名路由,以实现流量在不同版本间的精确分配。
| 特性 | 说明 | 灰度发布中的作用 |
|---|---|---|
| 版本(Version) | 函数代码与配置的不可变快照 | 每个灰度批次对应一个版本,支持回滚 |
| 别名(Alias) | 指向一个或多个版本的指针,支持权重路由 | 实现灰度流量按比例分发(如 10% → 50% → 100%) |
| 并发实例 | 函数同时运行的实例数,受弹性伸缩控制 | 灰度期间需预留实例,避免冷启动影响体验 |
| 运行时沙箱 | 每个实例运行在独立的容器/沙箱中 | 灰度版本与稳定版本隔离,互不干扰 |
灰度发布关键配置示例:通过别名将 10% 流量指向新版本 v2,90% 指向稳定版本 v1。
# 创建别名 prod,指向 v1(权重 90%)和 v2(权重 10%)
aliyun fc CreateAlias --serviceName myService --functionName myFunc \
--aliasName prod \
--versionId "v1" \
--additionalVersionWeight '{"v2": 0.1}'
3.3 API 网关 —— 流量入口与路由
API 网关是外部请求进入 Serverless 平台的统一入口。在灰度发布流水线中,API 网关承担着流量分发、请求过滤与灰度标签透传的职责。
- 路由规则:根据请求路径、Header、Query 参数将请求路由到不同函数或别名。
- 灰度策略:支持基于 Header(如 x-canary: true)或 Cookie 的灰度路由,实现用户维度的灰度。
- 限流熔断:灰度期间若新版本出现异常,网关可快速熔断,保护下游函数。
- 日志透传:在请求 Header 中注入灰度批次 ID、traceId,便于日志关联。
最佳实践:在 API 网关层配置灰度 Header 白名单,确保灰度流量只对指定测试用户生效,避免影响全量用户。
3.4 事件驱动 —— 异步解耦与触发
事件驱动是 Serverless 平台的异步处理核心。在发布流水线中,事件驱动机制用于异步灰度验证、日志采集与伸缩事件通知。
| 事件源 | 触发场景 | 灰度发布关联 |
|---|---|---|
| 对象存储(OSS) | 文件上传/删除 | 灰度版本处理新格式文件,验证兼容性 |
| 消息队列(MNS/Kafka) | 异步消息处理 | 灰度批次消费特定 Topic,隔离消息流 |
| 定时触发器 | 定时任务 | 灰度版本在低峰期执行,降低影响面 |
| 日志服务(SLS) | 日志消费与投递 | 灰度日志实时投递到分析平台,用于监控 |
3.5 弹性伸缩 —— 动态资源保障
弹性伸缩是 Serverless 平台应对流量波动的关键能力。在灰度发布过程中,弹性伸缩需要同时处理新旧版本的并发实例,确保灰度批次不会因资源不足而失败。
3.6 组件协作:灰度发布流水线中的交互
在灰度发布流水线中,四大组件通过以下协作流程完成一次灰度批次部署:
- 触发灰度:CI/CD 系统调用 API 网关,创建函数别名并设置灰度权重。
- 预热实例:弹性伸缩组件根据灰度批次配置,为灰度版本预留指定数量的实例。
- 路由流量:API 网关根据灰度策略(权重/Header),将部分请求路由到灰度版本。
- 执行函数:函数计算运行灰度版本代码,并将执行日志、指标发送到日志服务。
- 事件通知:灰度版本处理完成后,通过事件总线发送完成事件,触发下一批次或回滚。
- 伸缩调整:弹性伸缩根据实时指标调整灰度版本实例数,确保响应时间达标。
注意:在组件协作中,日志留痕必须贯穿全流程。每个组件(API 网关、函数计算、弹性伸缩)都需输出结构化日志,包含灰度批次 ID、版本号、实例 ID、时间戳,以便在出现问题时快速定位故障点。
3.7 组件对比与选型建议
| 组件 | 核心职责 | 灰度发布关键能力 | 日志留痕要点 |
|---|---|---|---|
| 函数计算 | 代码执行与版本管理 | 别名路由、版本隔离、并发控制 | 函数执行日志、版本号、实例 ID |
| API 网关 | 流量入口与路由分发 | 灰度 Header 路由、限流熔断 | 请求日志、灰度标签、响应状态 |
| 事件驱动 | 异步解耦与事件触发 | 事件过滤、灰度 Topic 隔离 | 事件 ID、触发时间、处理结果 |
| 弹性伸缩 | 动态资源调整 | 预留实例、并发阈值、伸缩策略 | 伸缩事件、实例数变化、原因 |