SpringCloud Sentinel服务熔断模式的认识
SpringCloud Sentinel服务熔断模式的认识
1.降级策略中的设置
最大RT,比例阈值,熔断时长,最小请求数,统计时长的理解
- 最大RT:Response Time 响应时间,超过时间则为慢调用
- 比例阈值:当服务请求数超过最小请求数,那么在统计时长里,如果策略为慢调用比例,那么慢调用占全部请求数的比例超过或等于比例阈值(慢调用/全部请求数),那么就会触发熔断,阈值范围为[0.0,1.0]代表 0% - 100%,如果为0.5则是慢调用占全部请求数的比例为50%或以上则触发熔断。
- 熔断时长:顾名思义,就是触发熔断后,熔断持续的时长。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
- 最小请求数:熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断。
- 统计时长:即在设定的时间内进行统计。
降级策略-RT
官网定义:慢调用比例(
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
官方在这里称RT为最大的响应时间,这个最大的响应时间就是我们微服务处理调用所产生的时间,假如设置RT为200,则意思就是如果我们微服务处理完调用耗时200毫秒以下,那就不是慢调用,假如是200毫秒以上,那么则会被统计为慢调用。所以通俗地讲,RT越大,那么微服务处理任务的时间阈值越大。则是上代码:
@GetMapping("/testD")
public String testD() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD 测试RT");
return "------testD";
}
业务处理方法上,我们加了休眠一秒钟,而我们在熔断策略上设置了RT为200,那么处理业务最少都需要1秒钟,所以我们的请求无论如何,都会被认为是慢调用,从而触发熔断降级机制。
降级策略-异常比例
官方定义:异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。
简单来说,就是没有了RT(慢调用),而是针对服务异常而进行的策略,这里我们上代码。
@GetMapping("/testD")
public String testD() {
log.info("testD 异常比例");
int age = 10/0;
return "------testD";
}
这里如果我们直接调用会出现java.lang.ArithmeticException: / by zero异常,那么我们对该地址进行并发测试,当达到比例阈值后,则会进行熔断处理。
降级策略-异常数
官方定义:异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
这里系统的默认统计时长为1分钟,当服务调用近一分钟的异常数超过设定异常数,则会触发熔断,统计时长的设置在这里会无效。
@GetMapping("/testE")
public String testE(){
log.info("testD 测试异常数");
int age = 10/0;
return "------testD 测试异常数";
}
我们设定异常数为20,那么当一分钟内访问该服务,出现异常20次,那么就会触发熔断。