SpringCloud-Gateway(常见的限流算法)

35 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

Gateway实现限流

Gateway 中可以使用 RequestRateLimiter 实现限流

常见的几种限流算法

在了解GatewayRequestRateLimiter之前需要先了解一下常见的限流算法,常见的算法一般有以下几种:

一、计数器算法

用以QPS(全称是:Queries-per-second,意思就是每秒的查询率,常见的一种压力测试的参数)。
以每秒 100 次查询来举例说,从第一个请求开始计时,每次来一个请求的时候计数器就会进行 +1 ,当计数器的数值达到 100 之后其他来的所有请求都会直接进行拒绝。
假如在一秒钟时间内,前 300ms 的请求数量达到了 100,后面不管是来了多少个请求都会直接拒绝掉无法进行正常访问,这种情况被称为 突刺现象
注意:计数器算法固定是多少 QPS 就是多少数字,不会根据实际情况进行变更。

二、漏桶算法

在计算器算法上面进行优化了一下,并且有效的解决了 突刺现象
比如在处理访问的时候把 100 作为QPS,那么同时处理的请求可以有 100个,当前 200ms 的时候处理完了第一个进入的请求,那么就会在 200ms 的时候再让一个请求进来,同时处理的请求有 100个,但前面的请求结束了就会处理之后的请求,同时请求的数量不超过设置的阈值。

三、令牌桶算法

令牌桶算法 算法又是漏桶算法的一种优化。
当我们设置 100 QPS的时候,每次的请求都必须从令牌桶中拿到对应的令牌,只有携带令牌的请求才会正常处理,如果 100 个令牌都拿完了,那么可以自行选择是否进行 等待 或者直接 进行拒绝。

注意:RequestRateLimiter 是基于 Redis 和 Lua 脚本实现的令牌算法。