1. 熔断概念:熔断器模式起源、微服务中熔断的作用、与限流/降级的区别

1.1 熔断器模式起源

熔断器(Circuit Breaker)模式源自电气工程中的物理断路器——当电路过载或短路时,断路器自动跳闸切断电路,保护上游设备不被烧毁。2008 年,Michael Nygard 在其著作 Release It! 中首次将这一思想引入软件架构,用于解决分布式系统中的级联故障问题。

核心思想: 当对下游服务的调用连续失败达到阈值时,熔断器“跳闸”,后续请求不再实际调用下游,而是快速返回降级响应,给下游恢复时间;待下游恢复后,熔断器半开试探,逐步恢复流量。

1.2 微服务中熔断的作用

在微服务架构中,服务间依赖关系复杂,单个服务故障可能通过调用链迅速扩散,引发“雪崩效应”。熔断机制在以下三个层面发挥关键作用:

作用维度 具体说明 典型场景
故障隔离 将故障限制在局部,防止下游服务崩溃拖垮上游调用方 数据库连接池耗尽、下游 Pod 宕机
快速失败 熔断后请求立即返回降级响应,避免线程/连接长时间阻塞 HTTP 请求超时、gRPC 调用无响应
自动恢复 熔断器定期探测下游健康状态,恢复后自动关闭,无需人工介入 下游服务重启、网络抖动恢复
关键指标: 熔断决策通常基于三个核心参数——错误阈值(连续失败次数或错误率)、熔断超时(进入半开状态前的等待时间)、半开最大请求数(试探期间允许通过的请求量)。
熔断器三态状态机 CLOSED 正常调用 OPEN 快速失败 HALF-OPEN 试探恢复 失败阈值 超时等待 试探成功 → 关闭 试探失败 → 断开 说明: CLOSED:正常调用下游;OPEN:直接返回降级,不发起实际调用;HALF-OPEN:放行少量请求探测下游是否恢复。 Envoy 熔断器在此基础上增加了并发请求数、连接数、重试次数等多维指标。

1.3 熔断与限流、降级的区别

熔断、限流、降级是服务治理的“三驾马车”,但三者目标与触发机制有本质区别。以下从多个维度进行对比:

对比维度 熔断(Circuit Breaker) 限流(Rate Limiting) 降级(Degradation)
核心目标 防止级联故障,保护调用方 控制流量速率,保护被调用方 牺牲非核心功能,保障核心功能
触发条件 下游连续失败/错误率超标 请求速率/并发数超过预设阈值 资源不足、依赖故障、业务高峰期
动作表现 切断调用链路,快速失败 排队、拒绝、限速 返回兜底数据、关闭非核心功能
恢复方式 自动半开探测,逐步恢复 流量回落到阈值以下自动恢复 手动或自动,依赖运维策略
典型实现 Envoy 熔断器、Hystrix、Resilience4j Envoy 本地限流、全局限流、令牌桶 业务降级开关、静态回退数据
常见误区: 熔断不等于限流。限流是主动预防,在系统过载前就限制流量;熔断是被动响应,在检测到下游故障后才切断链路。两者可以配合使用:限流保护自身不被冲垮,熔断保护自身不被下游拖垮。
熔断 / 限流 / 降级 对比关系 熔断 保护调用方 下游故障 → 切断链路 自动半开恢复 限流 保护被调用方 流量超标 → 拒绝/排队 流量回落自动恢复 降级 保障核心功能 资源不足 → 牺牲非核心 手动/自动恢复 三者协同关系: 1. 限流在入口处拦截,防止系统过载;熔断在调用链中阻断,防止故障扩散。 2. 降级是熔断后的兜底策略——熔断触发后,返回降级数据而非直接报错。 3. 在 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 会根据请求优先级动态选择对应的熔断策略。