依赖
一不一定时用这个依赖,谷歌其他的工具有的也会引用guava。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
<type>bundle</type>
</dependency>
实现原理
实际上是使用了令牌桶算法,通过设定每秒中生成的令牌个数,达到用户需要的控制效果。
简单用法
RateLimiter limiter = RateLimiter.create(10.0); //这里是每秒创建十个
这就完成了创建,参数rate指每秒创建几个令牌,使用时通过一下几个函数去获取令牌。
acquire(int permits);
tryAcquire(int permits);
tryAcquire(int permits,long timeout, TimeUnit timeUnit);
acquire(int permits)
这个是阻塞式的去获取,即线程会一直等待直到获取到令牌,该函数会返回一个等待时间的double值。
如图:
这里是每秒创建一个令牌,每次线程请求获取两个。
acquire();这个重载函数默认是获取一个令牌
tryAcquire(int permits)
这个是非阻塞式获取,即线程不会等待获取令牌,获取不到返回false,,获取成功返回true,这也是一般使用选择的手段,一般返回false时写一个fallback函数去处理。
tryAcquire(int permits,long timeout, TimeUnit timeUnit);
这个重载函数就是允许设置等待时间,知道等待时间达到才会返回成功失败Boolen值。
rateLimiter.setRate(int rate)
我觉得最灵活的还是这里,可以随时设置生成令牌的速率,这个就可以在流量监控中,根据实际情况动态的修改生成速率来控制流量,属于一种轻量的实现方式。