Version: Next

Sentinel 热点限流

Sentinel 热点参数限流文档

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合 令牌桶算法 来进行参数级别的流控。热点参数限流支持集群模式。

提示

就是可以精确打击,对某一个参数,如 用户 ID,进行限流,即针对某个人限流,针对某个商品限流


配置热点参数限流

指定降级兜底方法

  • 写一个 Controller 的业务接口,可以接收两个参数 p1p2
  • 使用 @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 错误进行兜底,后续介绍