分布式限流方案(gateway限流,redis+lua实现限流,nginx限流)

23 篇文章 0 订阅

分布式限流方案(gateway限流,redis+lua实现限流,nginx限流)

终端研发部

编程语言|技术探索|毕业设计|简历指导|职业规划|职场经验

8 人赞同了该文章

目录

收起

限流算法

计数器:

漏桶算法:

令牌桶算法:

限流具体实现

网关限流:

redis+lua

Nginx限流

计数器算法

滑动窗口算法

写在最后的话

如果一段时间内请求的数量过大,就会给服务器造成很大压力,可能导致服务器无法提供其它服务。

限流算法

计数器:

计数器比较简单粗暴,比如我们要限制1s能够通过的请求数,实现的思路就是从第一个请求进来开始计时,在接下来的1s内,每个请求进来请求数就+1,超过最大请求数的请求会被拒绝,等到1s结束后计数清零,重新开始计数。

这种方式有个很大的弊端:比如前10ms已经通过了最大的请求数,那么后面的990ms的请求只能拒绝,这种现象叫做“突刺现象”。

漏桶算法:

就是桶底出水的速度恒定,进水的速度可能快慢不一,但是当进水量大于出水量的时候,水会被装在桶里,不会直接被丢弃;但是桶也是有容量限制的,当桶装满水后溢出的部分还是会被丢弃的。

算法实现:可以准备一个队列来保存暂时处理不了的请求,然后通过一个线程池定期从队列中获取请求来执行。

令牌桶算法:

令牌桶就是生产访问令牌的一个地方,生产的速度恒定,用户访问的时候当桶中有令牌时就可以访问,否则将触发限流。

实现方案:Guava RateLimiter限流

Guava RateLimiter是一个谷歌提供的限流,其基于令牌桶算法,比较适用于单实例的系统。

限流具体实现

网关限流:

Spring Cloud Gateway中提供了RequestRateLimiterGatewayFilterFactory类,这个是基于令牌桶实现的。它内置RedisReteLimiter,依赖于Redis存储限流配置和统计数据,我们也可以通过继承

org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter 或者是实现

org.springframework.cloud.gateway.filter.ratelimit.RateLimiter 接口来实现自己的RateLimiter。

具体实现如下:

1. 首先在网关服务引入依赖

2. 具体配置如下

3. 可以实现基于三个维度的限流:

上面所示的配置是每秒产生的令牌数量是1,当我们的请求速度大于这个数值时,就会返回429的状态码

redis+lua

1.在服务中引入lua脚本

2.读取lua

3.判断是否需要限流的代码

4. 上面我们可以看到正常情况下10s内只产生3个令牌,我们来看下效果

可以看到10秒内只有前三个请求通过,其他的都是被拒绝的,过了10s后又会有三个请求可以通过,这完全符合我们预期的效果。

Nginx限流

限制访问频率

Nginx可以通过参数ngx_http_limit_req_module模块来限制访问频率,使用的漏桶算法实现的;可以通过limit_req_zone命令以及limit_req命令限制单个ip的请求处理频率。

限制连接数

ngx_http_limit_conn_module模块提供了并发连接数的功能,可以使用limit_conn_zone命令和limit_conn进行配置,也是基于漏桶算法实现的。

补充:

计数器算法

通过一个计数器 counter 来统计一段时间内请求的数量,并且在指定的时间之后重置计数器。

该方法实现简单,但是有临界问题。例如,允许一分钟内通过的请求数为 N,如果在重置计数器的前后一小段时间内分别请求 N 次,那么在这一小段时间内总共请求了 2N 次,超出了规定的 N 次。

滑动窗口算法

是计数器算法的一种改进,将原来的一个时间窗口划分成多个时间窗口,并且不断向右滑动该窗口。

在临界位置的突发请求都会被算到时间窗口内,因此可以解决计数器算法的临界问题。

redis提供了丰富的数据类型及api,非常适合业务系统开发,统计计数(increment,decrement),标记位(bitmap),松散数据(hash),先进先出、队列式读取(list)

guava缓存作为本地缓存,能够高效的读取的同时,提供了大量api方便我们控制本地缓存的数据量及冷数据淘汰

参考:

作者: 码农木木
链接: https://juejin.cn/post/6921299013769625607
https://blog.csdn.net/qq_41880190/article/details/89404530
来源:掘金,csdn

PS?补充一下: 什么是Nginx,谈谈个人都理解,项目中是否用到,为什么要用,有什么优点?

Nginx常见的面试题:限流、正向、反向代理、负载均衡策略

写在最后的话

大家看完有什么不懂的可以在下方留言讨论,也可以私信问我一般看到后我都会回复的。最后觉得文章对你有帮助的话记得点个赞哦,点点关注不迷路

来源:分布式限流方案(gateway限流,redis+lua实现限流,nginx限流) - 知乎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值