最近使用了Guava提供的限流器RateLimiter觉得十分好用,遍想一探究竟。
RateLimiter使用的限流算法为令牌桶,这里对令牌桶算法不做过多的解释,不懂的同学可以搜索一番。
限流器创建
public static RateLimiter create(double permitsPerSecond) {
return create(permitsPerSecond, SleepingStopwatch.createFromSystemTimer());
}
static RateLimiter create(double permitsPerSecond, SleepingStopwatch stopwatch) {
// 1.new SmoothBursty对象
RateLimiter rateLimiter = new SmoothBursty(stopwatch, 1.0);
// 2.设置 限流值
rateLimiter.setRate(permitsPerSecond);
return rateLimiter;
}
SmoothBursty是RateLimiter的子类,它有一个参数名为maxBurstSeconds。这个参数的作用为,当限流器没有被使用时最多可以存放多少秒的令牌桶。默认的参数为1,即只可以保存1s产生的令牌。 下面来具体看一下限流值是如何被设置的。
public final void setRate(double permitsPerSecond) {
// 校验参数必须大于0
checkArgument(
permitsPerSecond > 0.0 && !Double.isNaN(permitsPerSecond), "rate must be positive");
// 加锁设置限流值
synch