3. 弃用策略设计:通知周期、标准头与策略模板

API 弃用不是一次性的技术操作,而是一套面向消费者的沟通与治理流程。设计良好的弃用策略能够降低迁移摩擦、避免生产事故,并为灰度验证提供明确的观测窗口。本节围绕通知周期、HTTP 标准头(Deprecation & Sunset)、超链接语义以及可复用的策略模板展开。

3.1 弃用通知周期:时间窗口与阶段划分

通知周期定义了从“首次宣布弃用”到“完全移除”之间的时间线。不同成熟度的组织应采用不同的窗口长度,但核心原则是:给消费者至少一个完整发布周期的时间进行迁移。

阶段 时间点 消费者可见信号 平台侧动作
Announcement T+0 Deprecation Header + 文档标记 停止新消费者接入旧版本
Migration Window T+0 ~ T+90d Sunset Header + 迁移指南链接 灰度流量逐步切至新版本
Hard Sunset T+90d 410 Gone / 404 旧版本完全下线
Post-Sunset T+90d ~ T+120d 无(仅监控残留调用) 清理路由与文档
建议:对于内部 API,通知窗口可缩短至 30 天;对于公开 API,建议至少 90 天。金融、医疗等合规敏感领域应延长至 180 天以上。

3.2 Deprecation Header 标准

Deprecation 响应头是 RFC 8594 定义的标准字段,用于在运行时告知消费者当前版本已被标记为弃用。它不强制消费者立即行动,但提供了明确的信号。

Deprecation: true
Deprecation: Sat, 01 Mar 2025 00:00:00 GMT
Deprecation: true; sunset="2025-06-01T00:00:00Z"

字段语义说明:

  • 布尔值:true 表示当前响应来自一个已弃用的 API 版本。
  • HTTP-date:表示该版本被标记为弃用的时间点。
  • sunset 参数:可选,指明计划移除的时间,与 Sunset Header 配合使用。
注意:Deprecation Header 应始终与 Sunset Header 成对出现。仅返回 Deprecation: true 而不提供移除时间,会增加消费者的不确定性。

3.3 Sunset Header 与超链接

Sunset 响应头明确告知消费者该 API 版本将在何时停止服务。它通常包含一个 HTTP-date 值,并建议附带 Link 头指向迁移文档。

Sunset: Sun, 01 Jun 2025 00:00:00 GMT
Link: <https://api.example.com/docs/v2-migration>; rel="sunset"

超链接的 rel="sunset" 语义允许消费者自动发现迁移资源,实现机器可读的弃用流程。

Header 用途 示例值
Deprecation 标记版本已弃用 true; sunset="2025-06-01T00:00:00Z"
Sunset 声明移除时间 Sun, 01 Jun 2025 00:00:00 GMT
Link 指向迁移文档 <https://...>; rel="sunset"

3.4 弃用策略模板

以下模板可直接嵌入 API 网关或 BFF 层,实现标准化的弃用响应注入。

# 弃用策略配置模板 (YAML)
api_deprecation:
  # 全局弃用窗口
  default_sunset_days: 90
  # 按版本覆盖
  versions:
    v1:
      deprecated_at: "2025-03-01T00:00:00Z"
      sunset_at: "2025-06-01T00:00:00Z"
      migration_url: "https://api.example.com/docs/v1-to-v2"
      # 灰度比例:0-100
      traffic_percent: 100
    v2:
      deprecated_at: null
      sunset_at: null
      migration_url: null
      traffic_percent: 0
  # 响应头注入规则
  headers:
    deprecation: true
    sunset: "{{ .Version.sunset_at }}"
    link: '<{{ .Version.migration_url }}>; rel="sunset"'
灰度集成:在策略模板中预留 traffic_percent 字段,可配合灰度验证系统动态调整旧版本的流量比例,实现“先通知、再切流、后下线”的平滑迁移。

3.5 弃用信号交互流程

下图展示了消费者与 API 网关之间的弃用信号交互过程,涵盖标准头传递与超链接发现。

弃用信号交互流程 消费者客户端 API 网关 旧版本服务 1. 请求旧版本 API 2. 转发至旧服务 3. 返回正常响应 4. 注入弃用头 5. 收到 Deprecation + Sunset 6. 解析 Link 头,跳转迁移文档

3.6 策略模板与灰度验证的衔接

弃用策略模板不应孤立存在,它需要与灰度验证系统共享以下关键字段:

  • 版本标识:v1、v2 等,用于路由和指标聚合。
  • 流量比例:traffic_percent,灰度系统据此决定是否将请求转发至新版本。
  • 弃用时间戳:灰度系统可据此触发告警或自动调整比例。
最佳实践:将弃用策略模板存储在配置中心(如 Consul、etcd),灰度系统与 API 网关实时监听变更。当弃用时间到达时,自动将流量比例从 100% 逐步降至 0%,无需人工介入。