热点规则
热点参数流控规则,是一种更细粒度的流控规则,可以将规则设置到具体的参数上
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
1.代码
@GetMapping("/blockKey")
@SentinelResource("blockKey")
public String blockKey(@RequestParam(value = "host1",required = false) String host1,
@RequestParam(value = "host2",required = false) String host2,
@RequestParam(value = "host3",required = false) String host3){
return "热点限流";
}
注意:
热点规则需要注解 @SentinelResource(“资源名”),否则不生效
参数必须是7中基本数据类型才会生效
2.流控规则
注意: 资源名必须是@SentinelResource(value=“资源名”)中 配置的资源名,热点规则依赖于注解
当请求接口带有第一个变量的参数,每秒内请求达到3次,则达到阈值,流控生效,超过部分请求无法正常请求。
3.统一返回
根据以上测试,在热点控制生效时,返回异常的500页面,用户体验太差,为了更好的用户体验,利用@SentinelResource注解 blockHandler参数,这个参数是可以指定当出现异常时的处理方法,具体操作如下:
代码
@GetMapping("/blockKey")
@SentinelResource(value = "blockKey",blockHandler = "handle_blockKey")
public String blockKey(@RequestParam(value = "host1",required = false) String host1,
@RequestParam(value = "host2",required = false) String host2,
@RequestParam(value = "host3",required = false) String host3){
return "热点限流";
}
public String handle_blockKey(@RequestParam(value = "host1",required = false) String host1,
@RequestParam(value = "host2",required = false) String host2,
@RequestParam(value = "host3",required = false) String host3,
BlockException exception){
return "系统繁忙,请稍后再试";
}
注意:
两个方法的返回值相同,参数相同且多一个BlockException,blockHandler值和被调用方法相同,被调用方法用public修饰。
4.高级设置
上面的热点规则设定之后,所以使用这个参数都被添加了,高级设置对参数值做了规定,当参数值为设定值时,阈值为高级设置中的阈值。
当参数值为hu时,阈值为20
虽然频繁点击超过每秒3次,依然没有达到阈值