微服务架构下服务间调用频繁,当下游服务出现响应超时、错误率飙升等异常时,如果不做干预,上游服务会因为大量等待请求耗尽自身资源,最终导致整个系统不可用,这种情况就是雪崩效应。熔断机制可以在检测到下游服务异常时,暂时切断对它的调用,避免故障扩散,而服务网格作为处理服务间通信的独立层,能够原生支持熔断能力,不需要业务代码做任何改造。

服务网格熔断的核心原理
服务网格的熔断逻辑通常由数据平面的代理组件实现,以主流的服务网格Istio使用的Envoy代理为例,熔断的判断和生效都在Envoy的流量处理流程中完成,主要分为几个核心环节。
熔断的判断指标
服务网格一般支持多种维度的熔断判断指标,开发者可以根据业务场景选择合适的规则组合:
- 请求并发数阈值:限制对单个上游服务同时发起的最大请求数量,超过该值的新请求会直接被拒绝,避免上游服务被突发流量打垮。
- 错误率阈值:统计一定时间窗口内请求的上游服务错误比例,当错误率超过设定值时触发熔断。
- 慢请求比例阈值:统计请求响应时间超过设定阈值的请求占比,占比过高时触发熔断,避免慢请求拖垮上游服务。
- 最小请求数:只有统计窗口内的请求数量达到该值时,才会开始计算错误率、慢请求比例等指标,避免少量请求导致的误判。
熔断的状态流转
服务网格的熔断状态通常分为三种,和常规的熔断器状态逻辑一致:
| 状态 | 说明 |
|---|---|
| 关闭状态 | 正常状态,所有请求都会转发到上游服务,同时持续统计请求的各项指标。 |
| 打开状态 | 触发熔断后的状态,新请求会被直接拒绝,不会转发到上游服务,通常会返回预设的错误响应。 |
| 半开状态 | 熔断打开一段时间后进入的状态,会允许少量试探请求转发到上游服务,如果这些请求正常,就关闭熔断恢复转发;如果仍然异常,就再次打开熔断。 |
Envoy的熔断配置示例
Envoy是服务网格数据平面的核心组件,它的熔断配置通过circuit_breakers字段实现,下面以HTTP服务的熔断配置为例,展示具体的配置逻辑。
# Envoy 集群配置中的熔断规则示例
clusters:
- name: target_service_cluster # 上游服务对应的集群名称
connect_timeout: 1s
type: STRICT_DNS
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: target_service_cluster
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 192.168.0.10 # 上游服务地址
port_value: 8080
# 熔断配置
circuit_breakers:
thresholds:
- priority: DEFAULT # 优先级,DEFAULT表示默认优先级请求
# 最大并发请求数,超过该值的新请求会被直接拒绝
max_requests: 100
# 最大连接数,限制到该集群的最大TCP连接数
max_connections: 200
# 最大待处理请求数,超过该值的请求会被拒绝
max_pending_requests: 50
# 错误率相关配置,统计窗口为10秒,错误率超过50%触发熔断
# 最小请求数为10,即10秒内请求数不足10个时不触发错误率判断
error_percent_threshold: 50
# 统计窗口时长
stats_period: 10s
上面的配置中,当发往target_service_cluster集群的并发请求超过100、或者TCP连接数超过200、或者待处理请求超过50时,Envoy会直接拒绝新的请求;同时每10秒统计一次请求错误率,当10秒内的请求数不少于10个且错误率超过50%时,也会触发熔断逻辑。
服务网格熔断的落地注意事项
在实际使用服务网格实现熔断时,需要注意几个常见的问题:
阈值设置需要结合业务压测
熔断的各项阈值不能盲目设置,需要根据下游服务的实际处理能力来定。比如下游服务的最大并发处理能力是200,那么max_requests可以设置为200左右,设置过低会导致正常请求被误拒绝,设置过高则起不到保护下游的作用。建议在业务上线前做全链路压测,根据压测结果调整阈值。
区分不同优先级的请求
Envoy的熔断配置支持按优先级设置不同的规则,比如可以把核心业务的请求设置为HIGH优先级,非核心业务请求设置为DEFAULT优先级,给核心请求分配更高的阈值,避免非核心请求的异常影响核心业务。
熔断后的降级处理
服务网格只负责切断异常调用,熔断后上游服务收到的请求会被拒绝,业务层需要做好降级处理,比如返回缓存数据、默认兜底数据,或者提示用户稍后重试,避免直接给用户返回系统错误。
监控和告警配置
需要对接服务网格的监控指标,当熔断触发时及时发出告警,运维人员可以快速排查下游服务的故障,避免熔断长时间处于打开状态影响业务。Envoy会暴露envoy_cluster_circuit_breakers_open等指标,可以通过Prometheus等工具采集这些指标做监控。
总结
服务网格通过数据平面代理实现了无侵入的熔断能力,开发者只需要在服务网格的控制平面配置对应的熔断规则,就可以让所有经过代理的服务调用自动具备熔断保护,不需要在业务代码中引入额外的熔断组件。这种方式的维护成本更低,也避免了不同业务团队使用不同熔断组件带来的规范不统一问题,是微服务架构中落地熔断机制的高效选择。