一。介绍
官方文档:
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
1.是什么?
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel Parameter Flow Control
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
2.基本使用
要使用热点参数限流功能,需要引入以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-parameter-flow-control</artifactId>
<version>x.y.z</version>
</dependency>
由于sentinel依赖集成了sentinel-parameter-flow-control,所以引入sentinel依赖即可:
<!--springcloud alibb sentinel依赖 1.7版本依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
二。实现过程
通俗的来说热点参数限流规则就是将某个接口中带热点参数访问做一个限制,限制的方式只能是QPS限流,我们可以根据需要选择哪个参数作为热点参数来进行限流,甚至可以规定当热点参数的值满足等于多少条件时才进行限流。
1.代码
控制器示例代码如下:
/**
* 测试热点参数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";
}
//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){
return "------deal_testHotKey,o(╥﹏╥)o";
}
限流后的兜底方法分为两种,一种是系统默认的
Blocked by Sentinel(flow limiting)。
还有一种为我们自定义的,类似于hystrix
中的@HystrixCommand
注解,sentinel
中也提供了@SentinelResource
注解来进行自定义。
2.基础配置
这里将p1作为一个热点参数key进行限流操作,基础配置如下:
注意,这里的参数索引是以下标来控制的,比如接口第一个参数参数索引为0,第二个参数参数索引为1,以此类推。
测试:
条件一:当不带参数进行访问时,无论怎么刷新页面都不会进行限流操作:
条件二:当带参数p1时,一秒刷新一次时,访问正常:
带参数p1时,快速刷新,达到阈值后限流访问@SentinelResource
注解自定义降级方法:
条件三:同时带参数p1,p2时与条件二只带参数p1时一样:
条件四:只带参数p2时与条件一不带参数时一样:
3.高级配置
高级配置相对基础配置主要添加的,就是可以针对热点参数的某个值而进行限流操作
这里设置完成后一定要点添加操作:
直至添加的限流规则出现在下面的栏目中,再点击保存:
测试:
条件一:当p1值不为配置时的5时,连续刷新,触发限流:
条件二:当p1=5时,连续刷新,不触发限流: