根据上图来理解下Hystrix断路器的工作原理。
1、首先,经过断路器的流量需要超过一定的阈值【通过HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()进行配置】,才会去判断要不要断路。
看图中的例子,要求10s内经过断路器的请求达到50个才可能去触发判断断路,否则即使请求全失败也不会去判断要不要断路,比如图中 1,2,3步
2、如果断路器统计到的异常请求超过一定的比例【通过HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()配置】一般是50%,如图中4,5,7,100个请求中,有60个出现异常,失败率达到60%,此时则会开启断路。
3、断路器的状态由close 转换为open
4、断路器打开之后,用户再次发起的请求都会被断路,不再调用相应的服务,而是走服务降级策略fallback
5、经过一段时间【HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds()】之后,断路器会改为半开状态(half-open),此时用户再次请求会尝试调用后端服务,看是否能够成功。如果成功则将断路器关闭(close)
断路器常用配置参数说明:
(1)circuitBreaker.enabled
控制短路器是否允许工作,包括跟踪依赖服务调用的健康状况,以及对异常情况过多时是否允许触发短路,默认是true
HystrixCommandProperties.Setter()
.withCircuitBreakerEnabled(boolean value)
(2)circuitBreaker.requestVolumeThreshold
设置一个rolling window,滑动窗口中,最少要有多少个请求时,才触发开启短路
举例来说,如果设置为20(默认值),那么在一个10秒的滑动窗口内,如果只有19个请求,即使这19个请求都是异常的,也是不会触发开启短路器的
HystrixCommandProperties.Setter()
.withCircuitBreakerRequestVolumeThreshold(int value)
(3)circuitBreaker.sleepWindowInMilliseconds
设置在短路之后,需要在多长时间内直接reject请求,然后在这段时间之后,再重新变为half-open状态,尝试允许请求通过以及自动恢复,默认值是5000毫秒
HystrixCommandProperties.Setter()
.withCircuitBreakerSleepWindowInMilliseconds(int value)
(4)circuitBreaker.errorThresholdPercentage
设置异常请求量的百分比,当异常请求达到这个百分比时,就触发打开短路器,默认是50,也就是50%
HystrixCommandProperties.Setter()
.withCircuitBreakerErrorThresholdPercentage(int value)
(5)circuitBreaker.forceOpen
如果设置为true的话,直接强迫打开短路器,相当于是手动短路了,手动降级,默认false
HystrixCommandProperties.Setter()
.withCircuitBreakerForceOpen(boolean value)
(6)circuitBreaker.forceClosed
如果设置为ture的话,直接强迫关闭短路器,相当于是手动停止短路了,手动升级,默认false
HystrixCommandProperties.Setter()
.withCircuitBreakerForceClosed(boolean value)