Loading

熔断器的状态

熔断器有三个状态 CLOSED 、 OPEN 、 HALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为OPEN ,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为 HALF_OPEN 半开启状态,熔断探测服务可用则继续变更为 CLOSED 关闭熔断器。
Closed:关闭状态(断路器关闭),所有请求都正常访问。代理类维护了最近调用失败的次数,如果某次调用失败,则使失败次数加1。如果最近失败次数超过了在给定时间内允许失败的阈值,则代理类切换到断开(Open)状态。此时代理开启了一个超时时钟,当该时钟超过了该时间,则切换到半断开(Half-Open)状态。该超时时间的设定是给了系统一次机会来修正导致调用失败的错误。
Open:打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求次数最少不低于20次。
Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。
为了能够精确控制请求的成功或失败,我们在 shop_service_product 的调用业务中加入一段逻辑: 
@GetMapping("/{id}")
public Product findById(@PathVariable Long id) {
  if(id !=1 ) {
      throw new RuntimeException("太忙了");
  }
  return productService.findById(id);
}
这样如果参数是id为1,一定失败,其它情况都成功。
我们准备两个请求窗口:
  一个请求:http://localhost:8080/consumer/1,注定失败
  一个请求:http://localhost:8080/consumer/2,肯定成功
熔断器的默认触发阈值是20次请求,不好触发。休眠时间时5秒,时间太短,不易观察,为了测试方便,我们可以通过配置修改熔断策略: 
circuitBreaker.requestVolumeThreshold=5
circuitBreaker.sleepWindowInMilliseconds=10000
circuitBreaker.errorThresholdPercentage=50
参数说明:
  requestVolumeThreshold:触发熔断的最小请求次数,默认20
  errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%
  sleepWindowInMilliseconds:熔断多少秒后去尝试请求
当我们疯狂访问id为1的请求时(超过10次),就会触发熔断。断路器会端口,一切请求都会被降级处理。
此时你访问id为2的请求,会发现返回的也是失败,而且失败时间很短,只有20毫秒左右: 
posted @ 2021-07-27 17:19  1640808365  阅读(1023)  评论(0编辑  收藏  举报