SpringCloudGateWay之限流

时间:2024-12-14 12:05:50

一、引言
在高并发系统中,经常需要限制系统中的电流化妆。一方面是防止大量的请求使服务器过载,导致服务不可用,另一方面是防止网络攻击。
常用的限流方法,如hystrix、应用线程池隔离、超过线程池的负载和go融合逻辑。一般来说,应用服务器(如Tomcat容器)通过限制线程数量来控制并发性,而流量也由时间窗口的平均速度来控制。常见的限流纬度包括IP、URI和用户访问频率的限流。
_当前的限制通常在网关层完成,如nginx、openresty、kong、zuul、spring cloud gateway等,也可以通过aop在应用层完成。

2。限流算法
1。计数器算法
_计数器算法利用计数器来实现限流是有点简单和粗糙的,一般我们会限制一秒钟内可以传递的请求数,比如限流qps是100,算法的思想是从第一个请求开始计时,在下一个1s中,每个请求的计数都会增加1,如果累积ve数达到100,随后的请求将完成。部门拒绝了。1s后,将计数恢复为0并重新开始计数。具体实现如下:对于每个服务调用,可以添加计数器1和Atomiclong incrementandget()方法返回的最新值,并将最新值与阈值进行比较。这种实现方式,我相信大家都知道有一个缺点:如果我在一个单位时间的前10毫秒内通过了100个请求,那么后面的990毫秒只能眼睁睁地拒绝请求。我们称这种现象为“尖峰现象”。

2。漏桶算法
为了消除“尖峰现象”,可以采用漏桶算法来实现电流限制。漏桶算法的名字非常生动。算法中有一个容器,类似于日常生活中使用的漏斗。当请求进入时,相当于水倒入漏斗,然后从下小口缓慢均匀地流出。无论上面的流量有多大,下面的流量保持不变。无论服务调用者多么不稳定,都会使用泄漏桶算法来限制电流,并每隔10毫秒处理一次请求。因为处理速度是固定的,所以传入请求的速度是未知的。可能有许多请求突然出现。无法处理的请求首先放在存储桶中。因为它是一个桶,所以必须有一个容量上限。如果存储桶满了,新的请求将被丢弃。

_在算法的实现中,可以准备一个队列来保存请求,可以使用线程池(调度执行器服务)来定期从队列中获取请求并执行它们,从而一次获得多个并发执行。

该算法在使用后也有不足之处:不能处理短突发流量。

三。令牌桶算法
从某种意义上说,令牌桶算法是对漏桶算法的改进。bucket算法可以限制请求调用的速率,而token bucket算法可以限制平均调用速率,同时允许一定程度的突发调用。在令牌存储桶算法中,有一个存储固定数量令牌的存储桶。算法中有一种机制,可以以一定的速率将令牌放入存储桶中。每个请求调用都需要首先获取令牌。只有获得令牌后,才能继续执行。否则,选择是等待可用的令牌或直接拒绝。玩代币是一个连续的动作。如果桶中的令牌数达到上限,则将丢弃这些令牌。所以这种情况存在。桶中有大量可用的令牌。此时,可以通过令牌直接执行传入请求。例如,将qps设置为100,然后在当前限制器初始化后一秒钟,桶中有100个令牌。此时,服务还不可用。启动完成后,限流器能承受100个瞬时请求。因此,请求只在bucket中没有令牌时等待,这相当于以一定的速率执行。

_实现思想:您可以准备一个队列来保存令牌,并通过线程池定期将令牌生成到队列中。每个请求,您都可以从队列中获取一个令牌并继续执行。

三。Spring Cloud网关电流限制
在SpringCloudGateway中,有过滤器,所以上面提到的三个过滤器可以自己实现i