1. 前言
Sentinel版本:1.8.0
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
2. 热点规则配置
- 参数索引:接口参数的位置,从0开始
- 单机阈值:统计窗口时长内,相同参数最多允许的次数
写个接口测试:
@SentinelResource(value = "order1")
@GetMapping("/order1")
public String order1(String name, Integer age) throws Exception {
return name + "," + age;
}
流控规则:order1 这个接口的name参数值,在10秒内只能传递一次
- 打开浏览器,访问 http://localhost:8020/order1?name=fuhb
- 这时把name参数换个值,访问 http://localhost:8020/order1?name=zhangsan&age=10,结果正常
- 但是,只要在10秒内,name参数再次传递fuhb或者zhangsan,就会被熔断
- 这就是热点参数限流的作用
3. 参数例外项
上面的例子,参数在10秒内重复传值都会被限流。
假设现在有个需求:当name=fuhb的时候,QPS允许达到5,其他情况下QPS仍然保持1。这时就需要配置参数例外项。
如下图,应该很一目了然:
这时,我们反复访问 http://localhost:8020/order1?name=fuhb&age=10 接口,只要10秒内不超过5次,就不会被熔断。