服务熔断理论
断路器
相当于保险丝
熔断机制概述
熔断机制是应对-崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。
当检测到该节点微服务调用响应正常后,恢复调用链路。
在SpringCloudtÉ架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。
案例
服务层代码
/**
* 服务熔断
*/
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerHandle",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") // 失败率达到多少后跳闸
})
@Override
public String paymentCircuitBreaker(Integer id) {
if (id < 0) {
throw new RuntimeException("id不能为负数");
}
String serialNumber = IdUtil.simpleUUID();
return Thread.currentThread().getName() + "\t调用成功,流水号 = " + serialNumber;
}
private String paymentCircuitBreakerHandle(Integer id) {
return "id = " +id +",id不能为负数,请稍后再尝试!!!";
}
服务层代码讲解
- circuitBreaker.enabled:是否开启断路器
- circuitBreaker.requestVolumeThreshold:请求次数
- circuitBreaker.sleepWindowInMilliseconds:时间窗口期
- circuitBreaker.errorThresholdPercentage:失败率达到多少后跳闸
配置这几个属性是什么意思呢?
在开启断路器的情况下,如果在时间窗口期10s内,请求数量达到10次,并且请求失败率达到60%,也就是6次失败,跳闸后,在短时间呢?是不会恢复的,等过一段时间后,服务熔断会自己慢慢的恢复链路
还有,我是怎么知道上面几个属性的呢?
所有的属性你都可以在HystrixCommandProperties
类中找到
控制层代码
/**
* 服务熔断
* @param id
* @return
*/
@GetMapping("/circuit/breaker/{id}")
public String paymentCircuitBreaker(@PathVariable(value="id") Integer id) {
String result = paymentService.paymentCircuitBreaker(id);
return result;
}
测试服务熔断
正常访问
在10s以内疯狂出错,然后自动开启熔断,然后一段时间内,如果出错率降低,会慢慢回复链路的
熔断类型
熔断打开:请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则调用当前服务,如果洁求成功且符合规则则认为当前服务恢复正常,关闭熔断
断路器在什么情况下开始起作用
涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。
快照时间窗
断路器确定是否打开需要统计—些请求和错误数据,而统计的时间范囯就是快照时间窗,默认为最近的10秒
请求总数阀值
在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrⅸ命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
错误百分比阀值
当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
断路器开启或关闭的条件
当满足一定的阀值的时候(默认10秒内超过20个请求次数)
当失败率达到一定的时候(默认10秒内超过50%的请求失败)
到达以上阀值,断路器将会开启
当开启的时候,所有请求都不会进行转发
一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5
断路器打开之后
- 再有请求调用的时候,将不会调用主逻辑,而是直接调用降级 fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,減少响应延迟的效果。
- 原来的主逻辑要如何恢复呢?
对于这一问题, hystrix也为我们实现了自动恢复功能
当断路器打开,对主逻辑进行熔断之后, hysterⅸ会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。