一、前言

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 工作步骤

  1. 监控请求:Hystrix 会统计服务调用的状态(成功、失败、超时)。
  2. 判断健康状态:根据统计数据(如错误率),判断服务是否健康。
  3. 熔断逻辑:如果错误率过高,熔断器打开,阻止后续请求
  4. 降级逻辑:熔断器打开以后,触发自定义的降级逻辑
  5. 半开测试:经过一段时间以后,熔断器允许部分请求通过,测试服务是否恢复
  6. 恢复正常:如果测试成功,熔断器关闭,恢复正常请求

四、Hystrix熔断的实现原理

  1. 请求计数器和滑动窗口:Hystirx维护一个滑动窗口,用于记录最近一段时间的请求状态,根据滑动窗口中的数据计算错误lv
  2. 线程隔离:每个服务使用独立的线程池,防止一个服务的故障拖垮整个引用,线程池满,直接拒绝并触发降级。
  3. 触发熔断的条件
  • 请求总数超过最小请求值(如10个)
  • 错误率超过阈值(如50%)
  • 超时时间设置:如果请求超过指定的时间(2s),判定为超时。

五、Hystrix 熔断器的配置

配置样式

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000  # 超时时间,单位毫秒
      circuitBreaker:
        enabled: true                    # 启用熔断器
        requestVolumeThreshold: 10      # 熔断触发的最小请求数
        errorThresholdPercentage: 50    # 错误率阈值
        sleepWindowInMilliseconds: 5000 # 熔断器休眠时间

六、熔断器的优势

  1. 防止雪崩效应:避免因下游服务故障导致上游服务不可用。
  2. 快速失败:减少资源浪费,提升系统响应速度。
  3. 降级逻辑:为用户提供友好的备用响应,提升用户体验。
  4. 可恢复性:通过半开状态测试服务恢复情况。

爱跑步的猕猴桃
1 声望0 粉丝