1.开篇
上一篇文章说完了sentinel的流控规则,其中包括流控模式(直接、关联、链路)、流控效果(快速失败、预热、排队等待)。
更详细的内容可以参考:https://szh-forever-young.blog.csdn.net/article/details/119568801
这篇文章再来聊聊sentinel的降级规则。官方文档:https://github.com/alibaba/Sentinel/wiki/%E7%86%94%E6%96%AD%E9%99%8D%E7%BA%A7
这三种降级规则分别是:RT、异常比例、异常数。
· RT(平均响应时间,秒级)
平均响应时间 超出阈值 且 在时间窗口内通过的请求>=5,两个条件同时满足后触发降级。窗口期过后关闭断路器。
RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)· 异常比列(秒级)
QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级。
· 异常数(分钟级)
异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级。
这里需要注意:之前SpringCloud H版中的Hystrix服务熔断降级中是有半开状态的;而SpringCloud Alibaba的Sentinel的断路器是没有半开状态的,通俗来说,你的保险丝要么是断开,要么就闭合。
2.项目源码
github源码地址:https://github.com/2656307671/SpringCloud-Alibaba-Sentinel
gitee源码地址:https://gitee.com/szh-forever-young/SpringCloud-Alibaba-Sentinel
本次做Sentinel测试的代码请参考上面的仓库。
2.1 RT
我们在sentinel的界面中来配置RT。
首先设置RT的阈值为200ms,是说testD的请求必须在200ms内完成,如果无法完成,则在未来的1秒内将进行服务熔断降级;1秒持续进入5个请求是默认的。
之后在Postman中,设置testD这个请求,永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,如果超过200毫秒还没处理完(代码中每个testD请求都会sleep 1秒),在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了。后续Postman中的Run停止了,访问量逐渐减少了,再次访问testD可以看到恢复正常了。
2.2 异常比例
这里我们设置了异常比例是0.2,即20%。如果出错,在未来1秒钟的时间窗口内,断路器打开(保险丝跳闸)微服务不可用,保险丝跳闸断电了。
对应代码中的testE请求。其中有一行:int age = 10/0; 这明显是一个运行时异常。但是我们在Postman中设置了访问10次testE;直接高并发发送请求,多次调用达到我们的异常比例配置条件了。因为一出现异常,那异常比例就是100%啊,所以此时不再报错error而是服务降级了。
不使用Postman,直接访问了话,则会报error,此时与服务降级就无关了。单独访问一次,必然来一次报错一次(int age = 10/0),调一次错一次;
2.3 异常数
首先异常数是按分钟来统计的。这里对应代码中的testF请求方法。
这里设置的意思是:当异常数达到5次的时候,就会进行服务熔断降级,也即看到的是sentinel默认的出错页面信息,而不是error page。