Soul 中的请求限流
Soul 中的请求限流
RateLimiterPlugin 限流插件
限流方案:
限流算法:令牌桶算法
流程图:

令牌桶算法:
- 速率:令牌桶填充令牌的速率。等同于:可以匀速处理 QPS=令牌填充速率 的请求。
- 容量:令牌桶可以保存的最大令牌数。等同于:一秒内可以执行的最大请求数。(可以应对突发大流量)
Soul 中 RateLimiter 插件的使用
- 首先在 soul-admin 中将该插件开启并配置 redis 地址

-
在 soul-admin 中给该插件添加选择器和规则,并在规则中设置 令牌桶容量 和 令牌桶填充速率

-
然后访问 http://localhost:9195/rateLimiter/test ,当访问QPS > 2 时,请求会直接被拒绝。
{ "code": 429, "message": "You have been restricted, please try again later!", "data": null }
常用限流算法
漏桶算法
漏桶算法的实现一般采用队列,队列未满时,请求会直接放入队列,队列已满时,请求会被抛弃。然后会有请求的处理任务按着一定的速率从队列中取出请求并进行后续处理。
令牌桶算法
按着固定速率往令牌桶中添加令牌,当请求来临时,只有从令牌桶中获取到了令牌,请求才会被处理,否则直接拒绝。
对比
- 令牌桶算法通过令牌生成的速率来限制请求平均流入速率,允许突发大流量;而漏桶算法限制的是请求处理速率,可以平滑突发流量。
- 令牌桶算法按固定速率生成令牌,请求能否被处理取决于令牌桶中是否还有足够的令牌;漏桶算法按固定速率处理桶中的请求,不限制QPS,但当请求数累积到桶容量时,新请求会被拒绝。
限流实现
- Guava 中的 RateLimiter 采用令牌桶算法实现限流。
- Spring Cloud Gateway 中的 RequestRateLimiter 过滤器也是采用令牌桶算法实现限流
关于限流的一些经验总结
-
Guava 中的 RateLimiter 的限流使用起来很方便,但是它是单机的,无法跨 JVM 使用,但可以用在单机器上的接口限流等场景。因此如果分布式环境下需要采用其他的方案。要在分布式系统中实现全局限流,关键在于要将限流信息存在共享介质中,如Redis、memcached等分布式缓存中。同时为了为了保证限流的准确,写操作必须是原子操作。
-
分布式限流的几个要点:
- 限流令牌放到高可用的共享介质中,如 Redis 集群
- 消费令牌的操作必须是原子性的
本文介绍了Soul框架中的RateLimiterPlugin限流插件,该插件使用令牌桶算法实现请求限流。当请求超过设定的QPS时,超出的请求将被拒绝。详细讲解了配置过程,并对比了漏桶算法,强调了令牌桶算法在处理突发流量上的优势。此外,还探讨了Guava和SpringCloudGateway中限流的实现,并分享了分布式限流的关键点,如使用Redis实现跨JVM的限流及保证操作的原子性。
---- 请求限流&spm=1001.2101.3001.5002&articleId=113449333&d=1&t=3&u=db9684fdd8f24397a5a19dfea079be0e)
1840

被折叠的 条评论
为什么被折叠?



