spring cloud gateway限流 漏桶算法和令牌桶算法初识

本文介绍了在高并发场景下限流的重要性,并详细阐述了两种常见的限流算法——漏桶算法和令牌桶算法的工作原理。通过示例代码展示了如何在Spring Cloud Gateway中实现令牌桶限流,利用Bucket4j库进行流量控制,并提供了配置和过滤器的实现方式。
摘要由CSDN通过智能技术生成

前言

在高并发的应用中,限流是一个绕不开的话题。限流可以保障我们的 API 服务对所有用户的可用性,也可以防止网络攻击。

限流算法

令牌桶是一种限速算法,与之相对的是漏桶。常用的平滑的限流算法有两种:漏桶算法和令牌桶算法:

漏桶算法

漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。这里有两个变量,一个是桶的大小,支持流量突发增多时可以存多少的水(burst),另一个是水桶漏洞的大小(rate)。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发(burst)到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。

令牌桶算法

令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解。随着时间流逝,系统会按恒定 1/QPS 时间间隔(如果 QPS=100,则间隔是 10ms)往桶里加入 Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了。新请求来临时,会各自拿走一个 Token,如果没有 Token 可拿了就阻塞或者拒绝服务。令牌桶的另外一个好处是可以方便的改变速度。一旦需要提高速率,则按需提高放入桶中的令牌的速率。一般会定时(比如 100 毫秒)往桶中增加一定数量的令牌,有些变种算法则实时的计算应该增加的令牌的数量。

  • 令牌限速

当进行任务的操作时,消耗一定的令牌,后台以一定的速率生产令牌。在没有令牌的情况下,就阻塞任务,或者拒绝服务。令牌的生产速率,代表了大部分情况下的平均流速。

  • 桶限峰值

的作用就是存储令牌,消耗的令牌都是从中获取。桶的作用是用来限制流速的峰值,当桶中有额外令牌的时候,实际的流速就会高于限定的令牌生产速率。假设令牌生产速率为v,桶大小为b,处理时间为t,则实际流量速度为V=v+b/t

  • 额外消耗

为了保证功能的完整,后台必须保证令牌生产,而且是持续服务,不能中断。同时,为了功能的正确作用,当桶满了以后,后续生产的令牌会溢出,不会存储到桶内部。

基本使用

1.消费

public static void main(String[] args) {
        Bandwidth limit = Bandwidth.simple(10, Duration.ofSeconds(1));
        Bucket bucket = Bucket4j.builder().addLimit(limit).build();
        if(bucket.tryConsume(1)){
            System.out.println("do something");
        }else{
            System.out.println("do nothing");
        }
    }

Bandwidth:带宽,也就是每秒能够通过的流量,自动维护令牌生产。

Bucket:桶,不论状态,或是令牌的消费,bucket是我们操作的入口。

tryConsume:尝试消费n个令牌,返回布尔值,表示能够消费或者不能够消费,给我们判断依据。

为了简单理解可以尝试一下如下代码。

public static void main(String[] args) {
        Bandwidth limit = Bandwidth.simple(1, 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值