一、前言
Hystrix 的熔断机制是为了解决分布式系统中服务调用的稳定性问题。当下游服务出现异常(如高延迟或失败率过高)时,通过熔断器快速失败,避免将问题扩散到整个系统,从而保护上游服务和调用方的可用性。
二. 核心概念
2.1 熔断器(Circuit Breaker)
- 熔断器类似于电路中的保险丝。
- 根据服务的健康状况,切换不同的状态(打开,关闭,半开)
2.2 降级(Fallback)
- 当服务不可用或者超时的时候,执行降级降级,返回一个默认值或者备用逻辑
2.3 隔离
- 使用线程池或者信号量隔离请求,防止故障蔓延
2.4 触发条件
- 超时:服务响应时间超过阈值(下游服务器大量超时)
- 错误率:请求失败率超过设定阈值(下游服务器连接池被打满,导致服务抛出500响应码)
- 请求量:在一定的时间窗口,请求数到达最小阈值(瞬时流量到达高峰)
三、 Hystrix熔断的工作流程
3.1 熔断器的三种状态
- 关闭(Closed):
默认状态,所有请求正常发送到目标服务。如果请求失败率到达一定的阈值,切换到打开状态。
- 打开(Open)
熔断器打开,所有请求直接失败,不再发送给目标服务。触发降级逻辑,返回默认响应
- 半开(Half-Open)
熔断器打开一段时间后,进入半开状态。允许部分请求通过,测试服务是否恢复。
如果测试通过(低失误率),恢复到“关闭”状态;否则重新回到 “打开”状态。
3.2 熔断器状态转换流程
正常服务(Closed)
────────────→ 错误率高(超过阈值) ────────────→ 熔断(Open)
↓ ↑
休眠窗口时间结束 服务恢复成功
↓ ↑
半开(Half-Open) ←───── 测试失败
3.3 工作步骤
- 监控请求:Hystrix 会统计服务调用的状态(成功、失败、超时)。
- 判断健康状态:根据统计数据(如错误率),判断服务是否健康。
- 熔断逻辑:如果错误率过高,熔断器打开,阻止后续请求
- 降级逻辑:熔断器打开以后,触发自定义的降级逻辑
- 半开测试:经过一段时间以后,熔断器允许部分请求通过,测试服务是否恢复
- 恢复正常:如果测试成功,熔断器关闭,恢复正常请求
四、Hystrix熔断的实现原理
- 请求计数器和滑动窗口:Hystirx维护一个滑动窗口,用于记录最近一段时间的请求状态,根据滑动窗口中的数据计算错误lv
- 线程隔离:每个服务使用独立的线程池,防止一个服务的故障拖垮整个引用,线程池满,直接拒绝并触发降级。
- 触发熔断的条件:
- 请求总数超过最小请求值(如10个)
- 错误率超过阈值(如50%)
- 超时时间设置:如果请求超过指定的时间(2s),判定为超时。
五、Hystrix 熔断器的配置
配置样式
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 超时时间,单位毫秒
circuitBreaker:
enabled: true # 启用熔断器
requestVolumeThreshold: 10 # 熔断触发的最小请求数
errorThresholdPercentage: 50 # 错误率阈值
sleepWindowInMilliseconds: 5000 # 熔断器休眠时间
六、熔断器的优势
- 防止雪崩效应:避免因下游服务故障导致上游服务不可用。
- 快速失败:减少资源浪费,提升系统响应速度。
- 降级逻辑:为用户提供友好的备用响应,提升用户体验。
- 可恢复性:通过半开状态测试服务恢复情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。