SpringCloud Sentinel服务熔断模式的认识

SpringCloud Sentinel服务熔断模式的认识

image-20210909202835279

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越大,那么微服务处理任务的时间阈值越大。则是上代码:

image-20210909203634093

    @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(慢调用),而是针对服务异常而进行的策略,这里我们上代码。

image-20210909211818672

    @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次,那么就会触发熔断。

官方wiki:https://github.com/alibaba/Sentinel/wiki/熔断降级

posted @ 2021-09-16 19:33  Alickx  阅读(389)  评论(0编辑  收藏  举报