熔断与降级
对照 sc-circuit-breaker、Resilience4j。
30 分钟
熔断与降级
下游服务超时或报错时,若调用方 无限重试,线程会被占满,故障 扩散 到全链路。断路器(Circuit Breaker) 在失败过多时 快速失败 或 走降级逻辑——集成模式里的 容错 支柱。
学习目标
- 理解 Closed / Open / Half-Open 三状态
- 区分熔断、重试、超时、降级的组合
- 深入实践见 sc-circuit-breaker
三状态直觉
| 状态 | 行为 |
|---|---|
| Closed | 正常调用,统计失败率 |
| Open | 直接拒绝或 fallback,不再打挂掉的下游 |
| Half-Open | 试探少量请求,成功则关闭 |
像电路保险丝:连续短路就跳闸,保护整个系统。
在集成拓扑中的位置
[BFF / Composition API]
│
├── Feign + CircuitBreaker ──► course-svc ✓
├── Feign + CircuitBreaker ──► user-svc ✗ OPEN → fallback
└── Feign + CircuitBreaker ──► progress-svc ✓
│
用户仍看到页面(缺头像用默认图)
ip-api-composition 扇出多服务时,每路独立熔断,避免一路拖死整页。
Spring Cloud 示例
@FeignClient(name = "course-service", fallback = CourseClientFallback.class)
public interface CourseClient {
@GetMapping("/courses/{slug}")
Course getBySlug(@PathVariable String slug);
}
Resilience4j 配置与完整 walkthrough 见 sc-circuit-breaker。Gateway 层也可配 sc-gateway 限流与超时。
与消息集成的关系
- 同步链(Feign):熔断直接保护线程池
- 异步链(kafka-consumer):Consumer 内调外部 API 失败时,靠 重试 + DLQ,不是同一套 Circuit Breaker,但 Bulkhead(舱壁隔离线程池)思想相通
RabbitMQ 消费慢时 prefetch 与队列堆积监控类似「背压」。
合理组合
有限次重试(瞬时抖动)→ 熔断(持续故障)→ fallback(用户体验)
不要:Open 状态下仍同步阻塞等满超时。