1. 熔断器基础概念
1.1 熔断器模式的定义
熔断器(Circuit Breaker)是一种用于保护分布式系统稳定性的容错模式。其核心思想来源于电子工程中的物理熔断器:当电路中的电流超过额定阈值时,熔断器自动断开,防止设备烧毁。在微服务架构中,熔断器扮演类似的角色——当某个下游服务持续出现故障或响应超时时,熔断器主动切断对该服务的调用链路,避免故障级联扩散。
熔断器在运行时维护三种状态,构成有限状态机:
| 状态 | 含义 | 行为 |
|---|---|---|
| CLOSED(关闭) | 熔断器闭合,请求正常通过 | 统计失败率/慢调用率;未达阈值时不做干预 |
| OPEN(打开) | 熔断器断开,请求被快速失败 | 直接返回降级响应或抛出异常,不发起真实调用 |
| HALF_OPEN(半开) | 经过冷却时间后,允许少量探测请求通过 | 若探测成功则恢复 CLOSED,失败则回到 OPEN |
关键指标:熔断器依赖滑动窗口内的失败率、慢调用比例或最小请求数来触发状态转换。常见的滑动窗口实现包括基于时间窗口的计数器和基于令牌桶的统计。
1.2 熔断器与重试、限流的区别
熔断器、重试(Retry)和限流(Rate Limiting / Throttling)是微服务容错三板斧,但三者解决的问题域和触发条件有本质区别。混淆使用会导致资源浪费或保护失效。
| 维度 | 熔断器 | 重试 | 限流 |
|---|---|---|---|
| 核心目标 | 防止故障级联扩散 | 补偿临时性失败 | 控制请求速率,保护自身不被压垮 |
| 触发条件 | 下游持续失败/超时(失败率超阈值) | 单次调用返回可重试错误(如 5xx、网络超时) | 请求速率超过预设 QPS 或并发数上限 |
| 动作 | 断开调用链路,快速失败 | 等待间隔后重新发送请求 | 排队、降级或直接拒绝请求 |
| 副作用风险 | 降低吞吐,增加延迟感知 | 放大下游压力(重试风暴) | 丢弃合法请求,影响用户体验 |
| 典型实现 | Resilience4j CircuitBreaker、Hystrix | Resilience4j Retry、Spring Retry | Sentinel、Guava RateLimiter、Bucket4j |
常见误区:熔断器打开后不应再执行重试逻辑。若熔断器已断开,重试只会加剧下游压力并延迟熔断恢复。正确的做法是:熔断器打开时直接走降级路径,待 HALF_OPEN 探测成功后再恢复重试能力。
1.3 熔断器在微服务中的核心作用
在微服务架构中,服务间依赖关系复杂,单个服务故障可能通过调用链逐级放大,最终导致整个系统雪崩。熔断器在以下四个层面发挥关键作用:
- 故障隔离:将故障限制在局部范围内,防止一个服务的崩溃拖垮上游所有调用方。
- 快速失败:熔断器打开后,调用方立即返回降级响应(如缓存数据、默认值、错误提示),避免线程/连接资源被长时间阻塞。
- 自动恢复:通过 HALF_OPEN 状态定期探测下游健康状态,无需人工介入即可恢复服务。
- 资源保护:减少对故障下游的无效调用,释放线程池、连接池、内存等宝贵资源。
生产建议:熔断器应配合合理的超时时间和线程池隔离使用。超时时间过短会导致误熔断,过长则失去保护意义。推荐初始超时设为 P99 延迟的 1.5~2 倍,并在压测中验证。