4. 蓝绿发布 API 核心功能:切换流量、回滚、健康检查、状态查询
蓝绿发布的核心价值在于通过两套独立环境(蓝环境与绿环境)实现零停机切换与快速回滚。本章聚焦于自助服务 API 必须暴露的四个核心功能:流量切换、回滚、健康检查与状态查询。这四个 API 端点构成了自动化发布流程的“操作手柄”,也是 DevOps 团队与平台交互的主要入口。
设计原则:每个 API 端点应遵循幂等性与最终一致性原则。流量切换与回滚操作建议采用异步任务模式,避免长时间阻塞调用方。
4.1 核心功能总览
下表对比了四个核心 API 的用途、触发方式与关键响应字段,帮助快速建立全局认知。
| API 功能 | HTTP 方法 | 典型路径 | 触发方式 | 关键响应字段 |
|---|---|---|---|---|
| 切换流量 | POST | /api/v1/deploy/switch |
手动 / 自动流水线 | task_id, status, target_env |
| 回滚 | POST | /api/v1/deploy/rollback |
手动 / 告警触发 | rollback_id, previous_env, reason |
| 健康检查 | GET | /api/v1/health |
定时轮询 / 事件驱动 | overall_status, checks[] |
| 状态查询 | GET | /api/v1/deploy/status |
轮询 / Webhook 回调 | current_env, history[] |
4.2 切换流量 API
流量切换是蓝绿发布的核心操作,负责将用户流量从当前活跃环境(如蓝环境)瞬间切换到新版本环境(如绿环境)。API 设计需支持全量切换与灰度切换两种模式。
4.2.1 请求与响应结构
POST /api/v1/deploy/switch
Content-Type: application/json
{
"target_env": "green",
"strategy": "full", // "full" | "canary"
"canary_percent": 0, // 灰度比例,仅 strategy=canary 时有效
"reason": "v2.3.1 版本发布",
"timeout_seconds": 120
}
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"task_id": "switch-20250321-a1b2c3",
"status": "in_progress",
"target_env": "green",
"estimated_completion_seconds": 45,
"poll_url": "/api/v1/deploy/status/switch-20250321-a1b2c3"
}
关键设计点:
- 返回 202 Accepted 而非 200 OK,表明操作已接受但尚未完成。
- 提供
poll_url供调用方轮询任务状态,避免长连接。 - 灰度切换时,
canary_percent建议以 5% 为步进单位,最小不低于 1%。
4.2.2 流量切换流程
下图展示了从发起切换请求到流量完全迁移的完整流程,包含前置检查、路由更新与后置验证三个阶段。
4.3 回滚 API
回滚是蓝绿发布的安。当新版本出现严重故障时,API 应支持一键回滚到上一个已知健康的环境。回滚操作必须记录原因并保留审计轨迹。
4.3.1 请求与响应结构
POST /api/v1/deploy/rollback
Content-Type: application/json
{
"target_env": "blue",
"reason": "v2.3.1 出现 500 错误率超过 5%",
"skip_health_check": false,
"rollback_timeout": 180
}
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"rollback_id": "rb-20250321-x9y8z7",
"status": "rolling_back",
"from_env": "green",
"to_env": "blue",
"reason": "v2.3.1 出现 500 错误率超过 5%",
"poll_url": "/api/v1/deploy/status/rb-20250321-x9y8z7"
}
回滚安全策略:
- 默认启用前置健康检查,确保目标环境(如蓝环境)仍处于健康状态。
- 设置
skip_health_check: true仅限紧急场景,需额外权限校验。 - 回滚完成后自动触发一次全量健康检查,结果写入审计日志。
4.4 健康检查 API
健康检查是蓝绿发布的“眼睛”,为流量切换与回滚提供决策依据。API 设计需支持多层级检查:应用层、中间件层与基础设施层。
4.4.1 健康检查层级
| 层级 | 检查项 | 预期响应 | 超时设置 |
|---|---|---|---|
| L7 应用层 | HTTP 200 / 业务探针 | {"status":"ok"} |
5s |
| L4 中间件层 | 数据库连接 / 缓存可达 | TCP 连通 + 响应时间 < 200ms | 10s |
| L3 基础设施层 | Pod 状态 / 节点资源 | Running & CPU < 80% | 15s |
4.4.2 健康检查响应示例
GET /api/v1/health?env=green
HTTP/1.1 200 OK
Content-Type: application/json
{
"overall_status": "healthy",
"checks": [
{
"level": "L7",
"name": "application-probe",
"status": "pass",
"response_time_ms": 42
},
{
"level": "L4",
"name": "postgres-connection",
"status": "pass",
"response_time_ms": 87
},
{
"level": "L3",
"name": "node-cpu",
"status": "warn",
"message": "CPU 使用率 72%,接近阈值 80%"
}
],
"timestamp": "2025-03-21T10:30:00Z"
}
健康检查最佳实践:
- L7 探针应模拟真实用户请求,避免仅检查静态页面。
- L4 检查应包含连接池状态,而非仅 TCP 握手。
- L3 检查应关注资源余量,而非仅存活状态。
- 整体状态
overall_status采用“木桶原理”:任一 L7 失败即判定为unhealthy。
4.5 状态查询 API
状态查询 API 提供当前发布环境的全局视图,包括活跃环境、历史操作记录与各环境健康状态。该 API 是运维仪表盘与自动化流水线的主要数据源。
4.5.1 状态查询响应结构
GET /api/v1/deploy/status
HTTP/1.1 200 OK
Content-Type: application/json
{
"current_active_env": "green",
"standby_env": "blue",
"environments": {
"blue": {
"version": "v2.3.0",
"health": "healthy",
"traffic_percent": 0
},
"green": {
"version": "v2.3.1",
"health": "healthy",
"traffic_percent": 100
}
},
"history": [
{
"action": "switch",
"from_env": "blue",
"to_env": "green",
"timestamp": "2025-03-21T10:15:00Z",
"status": "completed"
},
{
"action": "rollback",
"from_env": "green",
"to_env": "blue",
"timestamp": "2025-03-20T22:30:00Z",
"status": "completed",
"reason": "错误率过高"
}
],
"last_updated": "2025-03-21T10:30:00Z"
}
4.5.2 状态查询与健康检查的关系
下图展示了状态查询 API 如何聚合健康检查数据,形成完整的发布视图。
4.6 API 调用优化建议
性能优化清单:
- 批量查询:状态查询 API 支持
?envs=blue,green参数,一次请求获取多环境状态。 - 条件轮询:健康检查 API 支持
?since=参数,仅返回变更后的检查结果。 - 异步回调:切换与回滚 API 支持
X-Callback-URL请求头,任务完成时主动推送结果。 - 缓存策略:状态查询结果缓存 30 秒,健康检查结果缓存 10 秒,减少后端压力。
- 限流保护:每个 API 端点按客户端 ID 限流,切换/回滚 API 每分钟最多 10 次。
4.7 错误处理与幂等性
| 场景 | HTTP 状态码 | 错误码 | 处理策略 |
|---|---|---|---|
| 目标环境不健康 | 409 Conflict | ENV_UNHEALTHY |
拒绝切换,返回详细检查结果 |
| 回滚目标不存在 | 404 Not Found | ROLLBACK_TARGET_MISSING |
提示用户手动指定目标环境 |
| 重复提交相同请求 | 200 OK | IDEMPOTENT_REPLAY |
返回已有任务状态,不重复执行 |
| 操作超时 | 408 Request Timeout | OPERATION_TIMEOUT |
自动触发回滚(切换场景)或标记失败 |
幂等性实现要点:
- 每个切换/回滚请求必须携带
idempotency_key(UUID),服务端缓存 24 小时。 - 相同
idempotency_key的重复请求直接返回首次执行结果,不重复操作。 - 健康检查与状态查询天然幂等,无需额外处理。