SpringCloud alibaba-Sentinel服务降级策略

Posted IT-熊猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud alibaba-Sentinel服务降级策略相关的知识,希望对你有一定的参考价值。

文章目录

RT:

平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 N 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

上图表示 需要1s持续进入5个请求,并且 平均响应时间大于 阈值,才会触发降级,打开断路器,等时间窗口结束,再关闭降级

1、添加testD接口,接口中设置1秒睡眠时间,即模拟响应时间为1s

    @GetMapping("/testD")
    public String testD()
    
        try TimeUnit.SECONDS.sleep(1); catch (InterruptedException e) e.printStackTrace();
        log.info(Thread.currentThread().getName()+"\\t"+"...testD 测试RT");
        return "------testD 测试RT";
    

2、Sentinel-dashboard中进行接口testD的RT设置,需要先请求一次testD,要不然dashboard中不会出现,设置降级策略为RT,RT值为200毫秒,时间窗口之降级时间间隔为1s,单位是秒

3、通过Jmeter做压力测试,设置请求testD接口,1秒内10个线程请求,永远循环


4、先请求一次testD接口没问题,再开启Jmeter压测,再浏览器请求一次testD发现已经快速失败了


5、测试结果表明RT策略成功,因为一秒10个线程请求满足了 RT的一秒5个请求,然后testD休眠1s满足了RT策略里的200ms阈值,所以能测试成功。

永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,
如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了。后续我停止jmeter,没有这么大的访问量了,断路器关闭(保险丝恢复),微服务恢复OK

异常比例:

异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

上图表示 QPS>=5 且异常比例超过阈值,触发降级,打开断路器,等时间窗口结束,再关闭降级

1、添加testF接口,接口中设置10/0,即模拟运行时异常

    @GetMapping("/testF")
    public String testF()
    
        log.info(Thread.currentThread().getName()+"\\t"+"...testF 测试 异常比例");
        int i = 10/0;
        return "------test 测试 异常比例";
    

2、Sentinel-dashboard中进行接口testD的 异常比例 设置,设置降级策略为 异常比例 ,异常比例为0.2即20%,时间窗口为3s

3、通过Jmeter进行压测,设置请求testF接口,1秒内10个线程请求,永远循环

4、先请求一次testF接口,会报by zero异常,当开启Jmeter压测后,再访问testF会快速失败,等关闭Jmeter后,再请求接口,又会报by zero异常

5、按照上述配置,单独访问一次,必然来一次报错一次(int age = 10/0), 调一次错一次;

开启jmeter后,直接高并发发送请求,多次调用达到我们的配置条件了。断路器开启(保险丝跳闸),微服务不可用了,不再报错error而是服务降级了。等关闭jmeter后,又恢复了,所以又请求一次报错一次

异常数:

异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

异常数是按分钟来统计的,所以时间窗口必须大于等于60s

上图就是表示,在一分钟内统计异常数超过阈值了,然后出发降级,打开断路器,等时间长款结束,关闭降级

1、添加testE接口,接口中设置10/0,即模拟运行时异常

    @GetMapping("/testE")
    public String testE()
    
        log.info(Thread.currentThread().getName()+"\\t"+"...testE 测试 异常数");
        int i = 10/0;
        return "------testE 测试 异常数";
    

2、在sentinel-dashboard中设置testE的降级策略为异常数,异常数为5,时间窗口为70s

3、请求接口testE,请求一次为by zero异常,请求两次也是报错,等请求到五次后就会出现服务降级,直接快速失败,等超过70s窗口期后,再请求testE,又会开始 异常数策略统计

至此,Sentinel中的服务降级 三种策略 RT、异常比例、异常数的demo演示案例上述已经演示完毕~~~~

以上是关于SpringCloud alibaba-Sentinel服务降级策略的主要内容,如果未能解决你的问题,请参考以下文章

springcloud01-SpringCloud 概述

SpringCloud系列SpringCloud概述及微服务技术栈的使用

springcloud2020版本使用zuul和nacos服务发现

springcloud情操陶冶-初识springcloud

SpringCloud学习系列-SpringCloud

springcloud nacos 跨服务调用失败