限流算法】java实现令牌桶算法
时间: 2024-03-28 11:33:01 浏览: 130
令牌桶算法是一种常见的限流算法,它可以控制请求的速率,防止系统被过多的请求压垮。下面是Java实现令牌桶算法的步骤和代码逻辑:
1. 定义一个令牌桶类,包含以下属性:
- 最后一次令牌发放时间
- 桶的容量
- 令牌生成速度
- 当前令牌数量
2. 实现一个获取令牌的方法,该方法会在每次请求到来时被调用,具体实现如下:
- 计算当前令牌数量
- 判断当前令牌数量是否足够
- 如果令牌数量不足,则拒绝请求
- 如果令牌数量足够,则领取令牌,并执行业务逻辑
3. 使用ScheduledExecutorService定时生成令牌,具体实现如下:
- 每隔一段时间生成一定数量的令牌
- 如果令牌数量超过桶的容量,则不再生成令牌
下面是Java实现令牌桶算法的代码逻辑:
```
@Slf4j
public class TokensLimiter {
private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
// 最后一次令牌发放时间
public long timeStamp = System.currentTimeMillis();
// 桶的容量
public int capacity = 10;
// 令牌生成速度10/s
public int rate = 10;
// 当前令牌数量
public int tokens;
public void acquire() {
scheduledExecutorService.scheduleWithFixedDelay(() -> {
long now = System.currentTimeMillis();
// 当前令牌数
tokens = Math.min(capacity, (int) (tokens + (now - timeStamp) * rate / 1000));
// 每隔0.5秒发送随机数量的请求
int permits = (int) (Math.random() * 9) + 1;
log.info("请求令牌数:" + permits + ",当前令牌数:" + tokens);
timeStamp = now;
if (tokens < permits) {
// 若不到令牌,拒绝
log.info("限流了");
} else {
// 还有令牌,领取令牌
tokens -= permits;
log.info("剩余令牌=" + tokens);
}
}, 1000, 500, TimeUnit.MILLISECONDS); }
public static void main(String[] args) {
TokensLimiter tokensLimiter = new TokensLimiter();
tokensLimiter.acquire();
}
}
```
阅读全文
相关推荐


















