十九、SpringCloud Alibaba Sentinel实现熔断和限流 (二 流控+降级+热点key)
四、流控规则
1、介绍模式
在sentinel控制台哪儿配置?
2、流控模式
1)直接快速失败
①、配置及说明
/testA请求每秒请求数(QPS)超过单机域值1,直接快速失败然后响应给客户端
②、测试
缺点:直接返回报错信息,是否可以由自己编写限流处理方法
2)关联模式
①、关联模式是什么?
当关联的资源达到阈值时,就限流自己
可以理解为:当支付模块挂了时,需要对订单模块进行限流
②、配置
当 /testB QPS达到域值 ,testA请求就不能使用
③、测试
postman 20个线程每0.3秒访问一次testB,然后查看testA的请求结果
3、流控效果
1)直接 -> 快速失败 (默认的流控效果)
2)预热
①、说明
阈值除以coldFactor(默认值是3),经过多少预热时长后才会达到阈值
②、配置
③、应用场景
秒杀系统开开启的瞬间,会有很多流量上来,很有可能会将系统打死,预热的方式就是慢慢的将阈值
增长到设置的阈值
3)排队等待
①、排队等待是什么?
②、排队等待的设置
设置 testA每秒一次请求,超过的话就排队等待,等待的超时时间为20000毫秒
五、降级规则
1、官网
https://github.com/alibaba/Sentinel/wiki
2、基本介绍
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或者异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误
当资源被降级后,在接下来的降级时间窗口期之内,对该资源的调用都会自动熔断(默认行为是抛出 DegradeException)
【注意 2020年的cloud ,现在是由HALF OPEN状态的】Sentinel断路器是没有半开状态的
参考Hystrix
半开的状态系统自动去检测是否有请求异常
没有异常就关闭断路器恢复使用
3、降级策略实战
1)RT
①、是什么?
②、配置测试
2)异常比例 (暂时未写,以后补上)
3)异常数(暂时未写,以后补上)
六、热点key限流
1、是什么?
对热点参数进行限流(例如促销商品的主键)
2、官网
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
3、@SentinelResource注解
为服务降级申明兜底方法
4、controller中声明兜底方法
@GetMapping("/testHotKey") @SentinelResource(value = "testHotKey",blockHandler = "del_testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false) String p2){ return "testHotKey"; } public String del_testHotKey(String p1, String p2, BlockedException exception){ return "========del_testHotKey,o(╥﹏╥)o"; }
5、在sentinel中添加热点限流配置
根据代码:
@SentinelResource(value = "testHotKey",blockHandler = "del_testHotKey")
在Sentinel控制台中添加配置
方法testHotKey里第一个参数,只要QPS超过每秒1次,马上进行降级处理
6、测试
7、参数例外项
普通的时候:超过1秒钟一个后,达到阈值后马上被限流
我们期待当p1参数是某个特殊值时,它的限流和平时不一样
配置如下
意思是:当p1的参数为1,每秒200次请求才会达到阈值
七、系统规则(总的配置 不常用)
配置全局QPS