热点规则
热点即用户经常访问的数据。我们希望统计某个热点数据中访问频次最高的 数据,并对其访问进行限制。如下图所展示的案例。
热点限流会统计传入参数中的热点参数,并根据配置的限流阈值的设置模式,对包含热点参数的资源调用请求进行限流。热点限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用请求生效。Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流。
控制层代码
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler/*兜底方法*/ = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
@RequestParam(value = "p2",required = false) String p2) {
//int age = 10/0;
return "------testHotKey";
}
/*兜底方法*/
public String deal_testHotKey (String p1, String p2, BlockException exception) {
return "------deal_testHotKey,o(╥﹏╥)o"; //sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
}
默认热点规则设置
运行测试
不携带参数
只携带第一个参数
只携带第二个参数
携带全部参数
测试反思
我们在控制层的代码里使用了@SentinelResource(value, blockHandler),其中value是资源名而blockHandler是就是指定奖及处理的方法。我们自己定义了降级兜底的返回参数,而且我们还在Sentinel的Web端对指定的资源进行了热点规则的设定,我们发现只要携带了指定索引的参数请求就会被限流。
高级热点规则设置(指定限流热点值)
运行测试
使用指定热点值去请求
不使用指定热点值去请求
测试反思
当我们使用设定的参数值去请求接口时,由于我们的QPS设置的数值大,所以我们明显感觉没有被限流,但是当我们使用了非指定热点参数进行请求时,我们的请求还是被限定带QPS等于1.其次就是这个返回的自定义提示只是热点规则限流的返回提,如果调用的方法抛出异常我们的其前端将会直接打印出来。