一、简介
soul 网关的限流采用redis 令牌桶算法进行限流,可以实现接口级别的限流。
Redis限流实现的三种方式:
-
基于Redis的setnx的操作:setnx的指令,在CAS的操作的时候,同时给指定的key设置了过期时间,我们在限流的主要目的就是为了在单位时间内,有且仅有N数量的请求能够访问我的程序,依靠setnx可以很轻松的做到这方面的功能,比如我们需要在10秒内限定20个请求,那么我们在setnx的时候可以设置过期时间10,当请求的setnx数量达到20时候即达到了限流效果;
-
基于Redis的数据结构zset:将请求打造成一个zset数组,当每一次请求进来的时候,value保持唯一,而score可以用当前时间戳表示,因为score我们可以用来计算当前时间戳之内有多少的请求数量。而zset数据结构也提供了range方法让我们可以很轻易的获取到2个时间戳内有多少请求;
-
基于Redis的令牌桶算法:每访问一次请求的时候,可以从Redis中获取一个令牌,如果拿到令牌了,那就说明没超出限制,而如果拿不到,则说明超出限制了。
Soul网关采用redis令牌桶算法进行限流,处理流程如下:
二、插件设置及使用
1. 启动Redis
Soul网关采用redis令牌桶算法进行限流,所以需要先启动一个redis服务
2. soul-admin配置
在 soul-admin–> 插件管理–> rate_limiter 将其设置为开启。
在插件中,对redis进行配置。
目前支持redis的单机,哨兵,以及集群模式。
如果是哨兵,集群等多节点的,在URL中的配置,请对每个实列使用;分割. 如 192.168.1.1:6379;192.168.1.2:6379。
如果用户无需使用,在admin后台把插件禁用。
- 在插件列表里新建选择器
速率(rate):是你允许用户每秒执行多少请求,而丢弃任何请求。这是令牌桶的填充速率;
容量(capacity):是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以保存的令牌数;
3. soul-bootstrap集成限流插件
在网关的 pom.xml 文件中添加 rateLimiter的支持,如下:
<!-- soul ratelimiter plugin start-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-ratelimiter</artifactId>
<version>${last.version}</version>
</dependency>
<!-- soul ratelimiter plugin end-->
三、总结
今天学习了rateLimiter插件的使用,明天分析其背后的原理和代码。