在springboot中使用Guava基于令牌桶实现限流

本文介绍如何使用Google的Guava库实现接口限流,通过令牌桶算法控制访问频率,提供核心代码示例及Spring Boot应用配置。

限流说详细了,名堂也多。这种算法那种算法,这种策略那种策略的。没有绝对的银弹。都要结合实际的场景来实现。最简单的,使用Google的Guava,几行代码。就可以优雅的对一个接口完成限流

令牌桶算法

通俗的理解就是,有一个固定大小的水桶,水龙头一直按照一定的频率往里面滴水。水满了,就不滴了。客户端每次进行请求之前,都要先尝试从水桶里面起码取出“一滴水”,才能处理业务。因为桶的大小固定,水龙头滴水频率固定。从而也就保证了数据接口的访问流量。

Guava

谷歌的一个工具库,包含了大量的Java工具类,像hash算法,字符串处理,集合等等。。。

https://github.com/google/guava

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>29.0-jre</version>
</dependency>

速率限制器 RateLimiter

/**
 * 创建一个限速器,每1秒,产生2.5个令牌 
 */
RateLimiter rateLimiter = RateLimiter.create(2.5, 1, TimeUnit.SECONDS);

/**
 * 尝试获取1个令牌,如果没有,会阻塞当前线程。直到获取成功返回。
 * 返回值是,阻塞的秒数
 */
double waitSeconds = rateLimiter.acquire();

/**
 * 尝试获取1个令牌,不会阻塞当前线程。
 * 立即返回是否获取成功。
 */
boolean success = rateLimiter.tryAcquire();

好了,这就是核心代码。就3行。首先创建一个限速器,指定令牌的生产频率。
核心的方法就是2种,阻塞获取令牌,非阻塞获取令牌。代码也通俗易懂。

重载方法

不论是阻塞获取令牌还是非阻塞获取令牌,它们都有几个重载方法。一看也清楚,就是可以设置获取令牌的数量,以及阻塞的时间。

public double acquire(int permits)

public boolean tryAcquire(Duration timeout)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值