1. 熔断概念:熔断器模式起源、微服务中熔断的作用、与限流/降级的区别
1.1 熔断器模式起源
熔断器(Circuit Breaker)模式源自电气工程中的物理断路器——当电路过载或短路时,断路器自动跳闸切断电路,保护上游设备不被烧毁。2008 年,Michael Nygard 在其著作 Release It! 中首次将这一思想引入软件架构,用于解决分布式系统中的级联故障问题。
核心思想: 当对下游服务的调用连续失败达到阈值时,熔断器“跳闸”,后续请求不再实际调用下游,而是快速返回降级响应,给下游恢复时间;待下游恢复后,熔断器半开试探,逐步恢复流量。
1.2 微服务中熔断的作用
在微服务架构中,服务间依赖关系复杂,单个服务故障可能通过调用链迅速扩散,引发“雪崩效应”。熔断机制在以下三个层面发挥关键作用:
| 作用维度 | 具体说明 | 典型场景 |
|---|---|---|
| 故障隔离 | 将故障限制在局部,防止下游服务崩溃拖垮上游调用方 | 数据库连接池耗尽、下游 Pod 宕机 |
| 快速失败 | 熔断后请求立即返回降级响应,避免线程/连接长时间阻塞 | HTTP 请求超时、gRPC 调用无响应 |
| 自动恢复 | 熔断器定期探测下游健康状态,恢复后自动关闭,无需人工介入 | 下游服务重启、网络抖动恢复 |
关键指标: 熔断决策通常基于三个核心参数——错误阈值(连续失败次数或错误率)、熔断超时(进入半开状态前的等待时间)、半开最大请求数(试探期间允许通过的请求量)。
1.3 熔断与限流、降级的区别
熔断、限流、降级是服务治理的“三驾马车”,但三者目标与触发机制有本质区别。以下从多个维度进行对比:
| 对比维度 | 熔断(Circuit Breaker) | 限流(Rate Limiting) | 降级(Degradation) |
|---|---|---|---|
| 核心目标 | 防止级联故障,保护调用方 | 控制流量速率,保护被调用方 | 牺牲非核心功能,保障核心功能 |
| 触发条件 | 下游连续失败/错误率超标 | 请求速率/并发数超过预设阈值 | 资源不足、依赖故障、业务高峰期 |
| 动作表现 | 切断调用链路,快速失败 | 排队、拒绝、限速 | 返回兜底数据、关闭非核心功能 |
| 恢复方式 | 自动半开探测,逐步恢复 | 流量回落到阈值以下自动恢复 | 手动或自动,依赖运维策略 |
| 典型实现 | Envoy 熔断器、Hystrix、Resilience4j | Envoy 本地限流、全局限流、令牌桶 | 业务降级开关、静态回退数据 |
常见误区: 熔断不等于限流。限流是主动预防,在系统过载前就限制流量;熔断是被动响应,在检测到下游故障后才切断链路。两者可以配合使用:限流保护自身不被冲垮,熔断保护自身不被下游拖垮。
1.4 Envoy 熔断器在服务网格中的位置
在 Istio/Envoy 服务网格中,熔断器配置在 Sidecar Proxy 层面,对应用层透明。Envoy 熔断器支持以下维度的检测:
- 集群最大连接数(Max Connections):限制与上游集群的 TCP 连接数。
- 集群最大请求数(Max Pending Requests):等待连接池的请求队列上限。
- 最大并发请求数(Max Requests):对上游集群的并发 HTTP 请求上限。
- 最大重试次数(Max Retries):允许的最大重试次数,防止重试风暴。
- 错误率阈值(Error Percentage):基于滑动窗口的 HTTP 5xx 错误率熔断。
Envoy 熔断配置示例(片段):
circuit_breakers:
thresholds:
- priority: DEFAULT
max_connections: 100
max_pending_requests: 10
max_requests: 50
max_retries: 3
- priority: HIGH
max_connections: 200
max_pending_requests: 20
max_requests: 100
max_retries: 5
上述配置为默认优先级和高优先级分别设置了熔断阈值,Envoy 会根据请求优先级动态选择对应的熔断策略。