- 有一个大小恒定的桶,这个桶的容量和设定的阈值有关,桶里放着很多令牌。
- 通过一个固定的速率,往里边放入令牌,如果桶满了,就把令牌丢掉。
- 当有请求进入时,就尝试从桶里取走一个令牌,如果桶里是空的,那么这个请求就会被拒绝。
rateLimiter提供了acquire()和tryAcquire()接口:
- 使用acquire()方法,如果没有可用令牌,会一直阻塞直到有足够的令牌
- 使用tryAcquire()方法,如果没有可用令牌,就直接返回false
- 使用tryAcquire()带超时时间的方法,如果没有可用令牌,就会判断在超时时间内是否可以等到令牌,如果不能,就返回false,如果可以,就阻塞等待
/**
* Guava
* Thread.sleep(100L); 可以测试速度以及成功率
* @author lizhifu
* @date 2021/1/13
*/
public class LimiterTest {
public static void main(String[] args) throws InterruptedException {
RateLimiter limiter = RateLimiter.create(100);
Thread.sleep(100L);
for(int i=1;i<100;i++){
if (limiter.tryAcquire(1, TimeUnit.MILLISECONDS)){
System.out.println("第"+i+"次请求成功");
}else{
System.out.println("第"+i+"次请求拒绝");
}
}
}
}