优雅降级
graceful-degradation;对照 rel-degrade。
25 分钟
优雅降级
下游变慢或不可用时,系统应 有损但可用 地响应用户,而不是长时间挂起或 500 雪崩。优雅降级(Graceful Degradation) 可在 应用层(fallback、缓存、功能开关)与 网格层(路由、超时、摘除实例)同时展开。
学习目标
- 区分降级、熔断、限流(对照 rel-degrade)
- 设计网格超时 + 应用 fallback 的组合
- 说清哪些降级逻辑必须在业务代码里
降级层次
| 层次 | 手段 | 示例 |
|---|---|---|
| 网格 | 超时、重试上限、traffic split 到稳定版 | VirtualService timeout 2s |
| 应用 | Feign fallback、读缓存、默认值 | 课程列表显示「加载中,请稍后」 |
| 产品 | 功能开关 | 关闭「推荐课程」模块 |
Spring Cloud 熔断 的 CourseClientFallback 是 应用层 典型;网格 不会 替你写「返回什么 JSON」,只保证 快速失败或打到健康实例。
网格侧可做的
# VirtualService 片段:路由超时
http:
- route:
- destination:
host: course-service
timeout: 2s
配合 DestinationRule outlierDetection,坏实例被临时踢出负载均衡池——用户请求自动落到其他副本,类似 无感降级。
全站故障时,网格可把流量 切回上一稳定 subset(蓝绿 / 金丝雀回滚),比逐个重启 jar 快。
应用侧必须做的
- 语义正确的兜底数据:缓存、静态文案、降级字段标记
- 幂等与订单类:网格重试不能代替业务去重
- 用户可感知提示:HTTP 200 +
degraded: truevs 503,产品需定义
对照 rel-degrade 的限流 429:网格 AuthorizationPolicy + 外部限流服务 可配合,但配额业务规则仍在应用。
与 SLO 的关系
降级策略应写在 错误预算 内(rel-slo、obs-slo):
- 降级响应是否算「成功」?若算,SLI 定义要一致
- 监控 降级触发次数,避免长期「静默失败」
练习
- 为 tracks API 设计:course-service 超时 2s 时 progress 服务返回「进度暂不可用」