Springboot项⽬中通过⾕歌的guava实现令牌桶算法,来进⾏请求限流
令牌桶算法是⼀种对请求限流的有效算法,核⼼思想是,⼀定时间内产⽣固定数量的令牌,拿到该令牌的请求可以通过,进⾏业务处理,没有拿到令牌的请求需要等待,直到新的令牌产⽣并领到该令牌,才可以通过,否则⼀直被阻塞或⼀定时间后拒绝。
令牌桶算法相⽐漏⽃算法,更加灵活、可控制。在java中,Google的Guava中有对令牌桶算法的实现,我们可以直接拿过来使⽤:
1. 依赖
<!-- google开源⼯具类,包含令牌桶算法 -->
<dependency>
<groupId&le.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
2. 使⽤
//创建令牌桶实例,30指⼀开始最⼤有30个令牌,并且每次⽣成30个
private RateLimiter rateLimiter = ate(30);
@GetMapping("/sale")
public AjaxResponse sale(Integer id){
AjaxResponse ajax = wSuccess();
try{
//1.没有获取到token请求⼀直直到获取到token令牌
//logger.info("等待时间 : " + rateLimiter.acquire());  //会⼀直等待
//2.设置⼀个等待时间,如果在等待的时间内获得到了token令牌,则处理业务,如果在等待时间内没有获取到token则抛弃
//最多等待3秒钟,3秒钟后还拿不到令牌就被抛弃
if(!Acquire(3, TimeUnit.SECONDS)){
ajax.setData("失败 !当前请求被限流,直接被抛弃");
return ajax;
}
try{
//⼀些⾃⼰的业务
//............
ajax.setData("SUCCESS!");
return ajax;
}catch(Exception e){
e.printStackTrace();
wInstance(Message());
}
}catch(Exception e){
e.printStackTrace();
wInstance(Message());
}
}
springboot推荐算法我们可以看到核⼼的两个调⽤,⼀个是 rateLimiter.acquire() ,类似于悲观锁,没有拿到令牌的请求会⼀直被阻塞,直⾄拿到了令牌、另⼀个是 Acquire(3, TimeUnit.SECONDS) ,指没有拿到令牌的请求最多等待3秒钟,3秒之后拿到令牌返回true,没有返回false,可以根据的业务场景进⾏开发。
相对于springcloud,有专门的 hytrix 和 sentinel 来进⾏限流和频率限制更加厉害。如果只是单纯普通的springboot项⽬,使⽤guava中的令牌桶算法来对请求进⾏限流是⼀种不错的⽅式。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。