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 错误进行兜底,后续介绍