Version: Next
Sentinel 热点限流
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的
Top K
数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用
LRU
策略统计最近最常访问的热点参数,结合令牌桶算法
来进行参数级别的流控。热点参数限流支持集群模式。
提示
就是可以精确打击,对某一个参数,如 用户 ID
,进行限流,即针对某个人限流,针对某个商品限流
配置热点参数限流
指定降级兜底方法
- 写一个 Controller 的业务接口,可以接收两个参数
p1
、p2
- 使用
@SentinelResource
注解
value
:唯一即可,规范起见,可以取 controller 方法的path
,可做资源名
使用blockHandler
:指定兜底方法,填写方法名
即可- 写一个兜底方法
FlowLimitController@GetMapping("/testHotKey")@SentinelResource(value = "testHotKey", blockHandler = "dealTestHotKey")public String testHotKey(@RequestParam(value = "p1", required = false) String p1,@RequestParam(value = "p2", required = false) String p2) {return "----testHotKey";}public String dealTestHotKey(String p1, String p2, BlockException exception) {return "----deal_testHotKey, o(╥﹏╥)o"; // sentinel的默认提示都是: Blocked by Sentinel (flow limiting)}
- 在 Sentinel 界面进行热点配置
- 资源名 与
@SentinelResource
注解的value
属性值一致- 定位限制参数使用的是
索引
,此处0
就表示第一个参数,也即p1
- 测试,访问
http://localhost:8401/testHotKey
携带p1
参数,在1
秒内多次请求,会看到触发了降级,并且执行了我们指定的降级兜底方法
参数例外项
设置参数例外项
- 上述普通设置,完成了当
p1
参数超过阈值时被限流的功能- 特殊需求:希望
p1
的取值为某个特殊值时,其限流阈值与普通设置不同
- 就是从
path
限流,细化到对参数
限流,再细化到对参数值
限流- 例如
p1 == 5
时,其阈值为200
- 在 Sentinel 中配置参数例外项
- 参数类型:只支持 8 种基本类型与 String
- 记得点
添加
按钮!
测试
- 疯狂访问
http://localhost:8401/testHotKey?p1=1111
会触发降级- 疯狂访问
http://localhost:8401/testHotKey?p1=5
可以得到正常响应,因为没达到阈值200
注意
Sentinel
blockHandler
只根据自身配置的规则进行兜底操作,Java 程序自身的 RunTimeException 不会触发 Sentinel 的兜底方法fallback
对 Java 错误进行兜底,后续介绍