熔断机制
熔断机制是应对雪崩效应的一种微服务链路保护机制,当系统链路中的某个微服务出现错误不可用或者响应时间太长的时候就会进行服务的降级,进而熔断该服务的调用,快速返回熔断的响应信息。当检测到该节点微服务调用正常后,就会恢复正常调用
在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用达到一定阈值,就会启动熔断机制。熔断机制的注解是@HystrixCommand。
Hystrix的服务熔断机制,可以实现弹性容错;当服务请求情况好转之后,可以自动重连。通过断路的方式,将后续请求直接拒绝,一段时间(默认5秒)之后允许部分请求通过,如果调用成功则回到断路器关闭状态,否则继续打开,拒绝请求的服务。
Hystrix熔断状态机模型:
状态机有3个状态:
-
Closed:关闭状态(断路器关闭),所有请求都正常访问。
-
Open:打开状态(断路器打开),所有请求都会被降级。Hystrix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。默认失败比例的阈值是50%,请求次数最少不低于20次。
-
Half Open:半开状态,不是永久的,断路器打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会关闭断路器,否则继续保持打开,再次进行休眠计时。
断路器重要参数
Hystrix有以下重要参数:
metrics.rollingStats.timeInMilliseconds:统计时间窗。断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是统计时间窗。默认为10s
circuitBreaker.sleepWindowInMilliseconds:休眠时间窗,熔断开启状态持续一段时间后,熔断器会自动进入半熔断状态,这段时间就被称为休眠窗口期。每隔默认 5000ms 放一个请求过去,试探所依赖的服务是否恢复。
circuitBreaker.requestVolumeThreshold :请求总数阀值。 在统计时间窗内,请求总数必须到达一定的数量级,Hystrix 才可能会将熔断器打开进入熔断开启转态,而这个请求数量级就是 请求总数阀值。Hystrix 请求总数阈值默认为 20,这就意味着在统计时间窗内,如果服务调用次数不足 20 次,即使所有的请求都调用出错,熔断器也不会打开。
circuitBreaker.errorThresholdPercentage:错误百分比阈值。 当请求总数在统计时间窗内超过了请求总数阀值,且请求调用出错率超过一定的比例,熔断器才会打开进入熔断开启转态,而这个比例就是错误百分比阈值。错误百分比阈值设置为 50,就表示错误百分比为 50%,如果服务发生了 30 次调用,其中有 15 次发生了错误,即超过了 50% 的错误百分比,这时候将熔断器就会打开。
我们可以通过修改hystrix的配置来修改熔断策略
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 3000 #服务降级超时时间circuitBreaker:errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20