令牌桶算法,怎么实现一定时间内触发阈值就限流
import java.util.LinkedList;
import java.util.Queue;
public class TokenBucket {
private int capacity; // 令牌桶容量
private int rate; // 令牌放入速率
private Queue<Long> tokens; // 令牌队列,用于存放令牌的时间戳
public TokenBucket(int capacity, int rate) {
this.capacity = capacity;
this.rate = rate;
this.tokens = new LinkedList<>();
}
public boolean allowRequest() {
long now = System.currentTimeMillis();
// 清理过期的令牌
while (!tokens.isEmpty() && now - tokens.peek() >= 1000) {
tokens.poll();
}
// 判断令牌数量是否超过阈值
if (tokens.size() < capacity) {
tokens.offer(now); // 放入令牌
return true; // 允许通过请求
}
return false; // 拒绝请求
}
public static void main(String[] args) {
TokenBucket tokenBucket = new TokenBucket(10, 2); // 令牌桶容量为10,令牌放入速率为2个/秒
for (int i = 0; i < 20; i++) {
if (tokenBucket.allowRequest()) {
System.out.println("允许通过请求");
} else {
System.out.println("拒绝请求");
}
try {
Thread.sleep(500); // 模拟请求间隔时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
okenBucket类表示令牌桶,通过allowRequest()方法判断是否允许通过请求。在main()方法中,模拟了20个请求,每个请求间隔500毫秒。根据令牌桶容量和令牌放入速率的设置,判断是否允许通过请求,并输出相应的结果。