平时咱们可能会对热点场景,比如说秒杀场景有解决方案,可能 sentinel 的 热点参数限流 功能也用不上
热点场景,比如说微博,有个明星绯闻,明星官宣等等,这种微博可能就会有大量的网民去查看,可能就容易系统崩溃,
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,如果访问参数是热点数据,就进行限流。
热点参数限流可以看做是一种特殊的流量控制,仅对入参是热点参数的请求调用生效。
注意:
- 热点规则需要使用@SentinelResource(“resourceName”)注解,否则不生效
- 参数必须是7种基本数据类型才会生效
测试用例
@RequestMapping("/info/{id}")
@SentinelResource(value = "userinfo",
blockHandlerClass = CommonBlockHandler.class,
blockHandler = "handleException2",
fallbackClass = CommonFallback.class,
fallback = "fallback"
)
public R info(@PathVariable("id") Integer id){
UserEntity user = userService.getById(id);
return R.ok().put("user", user);
}
配置热点参数规则
注意: 资源名必须是@SentinelResource(value=”资源名”)中 配置的资源名,热点规则依赖于注解
参数索引就是入参的下标,就是接口的入参位置,参数为0代表的是接口的入参从左往右第一个参数
单机阈值3 和统计窗口时长为1 的意思是 允许你一秒之内有3个请求过来.
参数类型只能有7种数据类型 ,就是上面的图片的红色圆圈里面的内容
上面的图片的意思是当你入参的参数为 3 的时候,允许你一秒之内有1个请求,如果超过1就进行限流
上面的配置总的来说意思就是: 单机阈值3 和统计窗口时长为1 的意思是 允许你一秒之内有3个请求过来,但是,如果你的入参参数为 3 的时候,允许你一秒之内有1个请求,如果超过1就进行限流
注意,一定要在这个方法上有 @SentinelResource(value=”资源名”)中 配置的资源名 ,否则不生效.
测试: