如果不知道如何配置sentinel或者不知道如何打开文章中的一些网页,可以参考我前面的文章: SpringCloud Alibaba学习(五):Sentinel的介绍与搭建
一、热点是什么
热点即经常访问的数据,很多时候我们希望统计或者限制某个热点数据中访问频次最高的TopN数据,并对其访问进行限流或者其它操作 。
官网:
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
二、配置方法
1、sentinel dashboard中
2、8401的controller中:
@SentinelResource注解在下一篇文章中会讲到,这里可以把它理解为@HystrixCommand,参考文章:SpringCloud学习(十四):Hystrix的服务熔断实现
@GetMapping("/testHotKey") @SentinelResource(value = "testHotKey", blockHandler = "deal_testHotKey") //blockHandler指定兜底方法 // value可以写任意值,一般和rest路径保持一致 public String testHotKey(@RequestParam(value = "p1", required = false) String p1, @RequestParam(value = "p2", required = false) String p2){ return "------testHotKey"; } public String deal_testHotKey(String p1, String p2, BlockException exception){ return "------deal_testHotKey"; }
三、测试
浏览器访问testHotKey,只要带上参数p1,在一秒内访问两次以上,就会限流。
而将代码中的blockHandler去掉后,在一秒内访问两次以上,会直接报错 。这样将异常显示到了用户界面,不够友好。
四、结论
限流模式只支持QPS模式,也只有QPS模式下才叫热点。
配置的参数索引是@SentinelResource注解的方法参数索引,0代表第一个参数,1代表第二个参数,以此类推;
单机阀值以及统计窗口时长表示在此窗口时间超过阀值就限流。
上例中,我们将参数索引指定为0,所以当访问路径带上第一个参数p1时,在一秒(统计窗口时长)内访问超过一次(单机阈值)就可能发生限流。
限流时会调用我们配置的blockHandler中的方法,给用户返回一个较为友好的提示,而不是报错的界面。
五、参数例外项
1、是什么
在上例中,如果我们访问带上参数p1,则一秒访问超过一次会被限流。那么,假如我们期望当p1参数是某个特殊值时,它的限流值和平时不一样,这时该如何配置呢?
2、配置方法
当p1参数为5时,限流阈值为200。
3、测试
如果访问时p1的值不为5,那么一秒内超过一次就会限流;而如果p1=5,则狂点鼠标也不会限流(达不到每秒200次访问,不知道有没有大佬的手能达到)。
六、注意
@SentinelResource 处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;而像RuntimeException这样的异常(比如int age = 10/0)是java运行时报出的运行时异常,@SentinelResource并不处理。
那么如果报出了这样的异常该怎么处理能够让用户体验更为友好呢?这就是我们后面要说到的内容。