熔断机制概述
熔断机制是对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用机制。
在SpringCloud框架里,熔断机制通过Hystrix实现,Hystrix会监控微服务调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。其注解是@HystrixCommand。
案例实操
// ====服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id) {
if(id < 0 ) {
throw new RuntimeException("id不能为负数");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName()+"\t"+"调用成功,流水号"+serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id) {
return "id不能为负数,请稍后再试"+id;
}
@HystrixCommand的三个主要参数
- 快照时间窗:断路器确定是否需要打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒
- 请求总数阈值:在快照时间窗内,必须满足总数阈值才有资格熔断。默认为20,意味着在10秒内,如果该Hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
- 错误百分比阈值:当请求总数在快照时间窗内超过了阈值,比如发生了30次调用,如果在这30此调用中,有15次发生了超时异常,也就是超过啦50%的错误百分比,在默认设定50%阈值情况下,这时候就会将断路器打开。
断路器开启或关闭的条件
- 当满足一定阈值的时候(默认10秒内超过20个请求次数)
- 当失败率达到一定的时候(默认10秒内超过50%的请求失败)
- 达到以上阈值,断路器将会开启
- 当开启的时候,所有的请求都不会进行转发。
- 一段时间后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发,如果成功,断路器会关闭,反之则会开启。