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服务降级策略的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud系列SpringCloud概述及微服务技术栈的使用