SpringCloudAlibaba-12-sentinel热点限流

前言

我们已经对单机限流和集群限流有过一定了解了,但是他们都是针对一些固定的资源进行流控的,在实际的应用场景中我们可能会遇到各种复杂的情况,不可能通过固定的资源来进行限流。

比如我们想要对一段时间内频繁访问的用户 ID 进行限制,又或者我们想统计一段时间内最常购买的商品 ID 并针对商品 ID 进行限制。那这里的用户 ID 和商品 ID 都是可变的资源,通过原先的固定资源已经无法满足我们的需求了,这时我们就可以通过 Sentinel 为我们提供的 热点参数限流 来达到这样的效果

内容

参考:https://www.jianshu.com/p/2efe5058fcf4

1.什么是热点(参数)?

  1. 首先我们需要知道什么是热点,热点就是访问非常频繁的参数
  2. 例如我们大家都知道的爬虫,就是通过脚本去爬取其他网站的数据,一般防爬虫的常用方法之一就是限制爬虫的 IP,那对应到这里 IP 就是一种热点的参数。
  3. 那么 Sentinel 是怎么知道哪些参数是热点,哪些参数不是热点的呢?Sentinel 利用 LRU 策略,结合底层的滑动窗口机制来实现热点参数统计。LRU 策略可以统计单位时间内,最近最常访问的热点参数,而滑动窗口机制可以帮助统计每个参数的 qps。

  4. 说简单点就是,Sentinel 会先检查出提交过来的参数,哪些是热点的参数,然后在应用热点参数的限流规则,将qps 超过设定阈值的请求给 block 掉,整个过程如下图所示:

如果参数携带:axb;他的qps大于5,会被阻塞掉

2.实战

  1. 1.我们创建一个ParamController
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
public class ParamController {
@GetMapping("/param")
@SentinelResource(value = "param",blockHandler = "exHandler")
public String param(String type){
return "success";
}
public String exHandler(String type){
/**
* 热点限流:参数限流
* 所以我们需要接受一个参数
* 如果不指定blockHandlerClass默认会从本类去寻找处理类:exHandler
*/
return "param request error";
}
}
  1. 2.访问
    curl http://127.0.0.1:18080/param
    然后打开sentinel,我们发现在param下面挂载了一个param资源,此时我们点进去:

    设置热线限流(全部限制):
  1. 3.测试访问

注意热线限流不支持接口资源,一定是带有@SentinelResource注解的资源

毕业于<br>相信技术可以改变人与人之间的生活<br>码农一枚