Gateway结合Redis使用令牌桶算法实现接口限流

1、限流的原理:

1.1、计算器算法

计数器算法采用计数器实现限流有点简单粗暴,一般我们会限制一秒钟的能够通过的请求数,比如限流qps为100,算法的实现思路就是从第一个请求进来开始计时,在接下去的1s内,每来一个请求,就把计数加1,如果累加的数字达到了100,那么后续的请求就会被全部拒绝。等到1s结束后,把计数恢复成0,重新开始计数。具体的实现可以是这样的:对于每次服务调用,可以通过AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。这种实现方式,相信大家都知道有一个弊端:如果我在单位时间1s内的前10ms,已经通过了100个请求,那后面的990ms,只能眼巴巴的把请求拒绝,我们把这种现象称为“突刺现象”

1.2、漏桶算法

漏桶算法为了消除"突刺现象",可以采用漏桶算法实现限流,漏桶算法这个名字就很形象,算法内部有一个容器,类似生活用到的漏斗,当请求进来时,相当于水倒入漏斗,然后从下端小口慢慢匀速的流出。不管上面流量多大,下面流出的速度始终保持不变。不管服务调用方多么不稳定,通过漏桶算法进行限流,每10毫秒处理一次请求。因为处理的速度是固定的,请求进来的速度是未知的,可能突然进来很多请求,没来得及处理的请求就先放在桶里,既然是个桶,肯定是有容量上限,如果桶满了,那么新进来的请求就丢弃。

 

在算法实现方面,可以准备一个队列,用来保存请求,另外通过一个线程池(ScheduledExecutorService)来定期从队列中获取请求并执行,可以一次性获取多个并发执行。
这种算法,在使用过后也存在弊端:无法应对短时间的突发流量。

1.3、令牌桶算法

从某种意义上讲,令牌桶算法是对漏桶算法的一种改进,桶算法能够限制请求调用的速率,而令牌桶算法能够在限制调用的平均速率的同时还允许一定程度的突发调用。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。算法中存在一种机制,以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。放令牌这个动作是持续不断的进行,如果桶中令牌数达到上限,就丢弃令牌,所以就存在这种情况,桶中一直有大量的可用令牌,这时进来的请求就可以直接拿到令牌执行,比如设置qps为100,那么限流器初始化完成一秒后,桶中就已经有100个令牌了,这时服务还没完全启动好,等启动完成对外提供服务时,该限流器可以抵挡瞬时的100个请求。所以,只有桶中没有令牌时,请求才会进行等待,最后相当于以一定的速率执行。

Gateway结合Redis使用令牌桶算法实现限流

gateway所需依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

配置Bean

 

yaml配置

 

 key-resolver对应配置的bean

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Cloud Gateway是一个构建在Spring Framework基础上的API网关,它可以用于实现负载均衡、路由转发、限流等功能。在进行限流操作时,Spring Cloud Gateway通常会使用一种称为令牌桶(Token Bucket)的算法。 令牌桶算法是一种简单有效的限流算法,它基于一个桶(Bucket)来存放一定数量的令牌(Token)。每个令牌表示一个可以访问服务的权限,当服务需要处理请求时,必须先获取一个令牌,如果桶中没有令牌,就需要等待。 通常情况下,Spring Cloud Gateway限流功能是通过在网关层面进行处理的。当请求到达网关时,网关会先检查请求是否超过限流规定的阈值,如果超过则拒绝请求,否则继续向后传递。这个限流操作并不会涉及到线程的变化。 而关于线程变为Redis的线程,可能是指在实际运行中,为了维护令牌桶算法所需的状态信息,可以将令牌桶的相关数据存储在Redis中,这样可以实现分布式限流,保证多个网关实例之间的限流规则一致性。 具体来说,可以在网关应用中使用Redis来存储令牌桶的Token信息,并使用Redis的分布式锁来保证多个网关实例之间对令牌桶的访问的互斥性,从而实现分布式限流的效果。这样,在实际运行中,网关处理请求时会从Redis中获取令牌桶的信息,并使用令牌桶算法进行限流操作。 总之,Spring Cloud Gateway限流功能并不会导致线程的变化。但为了实现分布式限流,可以将令牌桶的相关数据存储在Redis中,从而在网关处理请求时可以从Redis中获取令牌桶的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值