何为热点?
热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

针对热点参数规则的名词解释
- 资源名:系统默认路径
- 限流模式:QPS 热点规则只支持QPS
- 参数索引:即传入的热点参数索引(从0开始)明确位置
- 参数例外项:可以针对指定的参数值单独设置限流阈值,不受前面
count阈值的限制。仅支持基本类型和字符串类型

Sentinel的热点规则
这里我们用到兜底方法
兜底方法分系统默认和用户自定义,系统默认就是之前使用Sentinel时限流,出现的信息Blocked by Sentinel(flow limiting) 就是系统默认
而我们自己定义的方法输出的信息就是用户自定义,比如“系统开小差了,请稍后再试!”
代码片段:
/**
* 设置p1为热点参数key
* @param p1
* @param p2
* @return
*/
@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){
return "-----testHotKey";
}
/**
* 处理热点key兜底的方法
* @param p1
* @param p2
* @param exception
* @return
*/
public String deal_testHotKey(String p1, String p2, BlockException exception){
//用户自定义
return "系统繁忙开小差了,请稍后再试!";
//sentinel系统默认的提示:Blocked by Sentinel (flow limiting)
}
对于@SentinelResource这个注解在这里使用是作为实现限流的异常处理
默认情况下,Sentinel对控制资源的限流处理是直接抛出异常。这样对用户交流不友好,我们需要处理一下异常信息 ,所以通过@SentinelResource注解的blockHandler属性制定具体的处理函数即而,当遇到异常限流时,就会实现处理函数方法里面的内容。注意处理函数里面传参必须与资源点的传参一样,并且最后加上BlockException异常参数;同时,返回类型也必须一样
对热点key参数进行限流的尝试

参数索引是0代表对第一个参数进行热点key进行限流,单机阈值=1代表一秒访问一 次,窗口时长是1秒。
测试结果:
第一种情况:一秒刷新一次,没有问题。

第二种情况:突然疯狂刷新,QPS超过1就会进行降级处理走我们自定义的兜底方法

在这里我们只对第一个参数p1进行了热点规则的限流处理,而对第二个参数p2没有进行任何配置,它不管是按正常刷新访问还是疯狂刷新,它都没有问题
对热点参数例外项进行限流的尝试:
什么是参数例外项:参数例外项:可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
理解:



而第三张还是对第一个参数照旧处理,即当QPS超过1秒一次点击后马上就会被限流。
本文介绍了如何在Sentinel中使用热点参数限流功能,基于LRU策略和令牌桶算法实现流量控制。重点讲解了资源名、限流规则、QPS热点规则、参数例外项的概念以及如何通过自定义兜底方法处理异常情况。
743

被折叠的 条评论
为什么被折叠?



