共计 1895 个字符,预计需要花费 5 分钟才能阅读完成。
序
本文主要演示一下 bucket4j 的几个使用实例
maven
<dependency>
<groupId>com.github.vladimir-bukhtoyarov</groupId>
<artifactId>bucket4j-core</artifactId>
<version>4.0.1</version>
</dependency>
rate limit
@Test
public void testRateLimit(){
// define the limit 1 time per 10 minute
Bandwidth limit = Bandwidth.simple(1, Duration.ofMinutes(10));
// construct the bucket
Bucket bucket = Bucket4j.builder().addLimit(limit).build();
IntStream.rangeClosed(1,5)
.forEach(i -> {
executor.submit(() -> {
if(bucket.tryConsume(1)){
LOGGER.info(“acquired”);
}else{
LOGGER.info(“blocked”);
}
});
});
}
这里使用 simple 方法构造 Bandwidth,进而构建 bucket 实例
scheduler
@Test
public void testAsScheduler(){
// define the limit 100 times per 1 minute
Bandwidth limit = Bandwidth.simple(5, Duration.ofMinutes(1));
// construct the bucket
Bucket bucket = Bucket4j.builder().addLimit(limit).build();
// do polling in infinite loop
while (true) {
// Consume a token from the token bucket.
// If a token is not available this method will block until the refill adds one to the bucket.
try {
bucket.asScheduler().consume(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOGGER.info(“do remote call”);
}
}
输出实例
23:14:46.740 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:14:46.744 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:14:58.749 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:15:10.749 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:15:22.754 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:15:34.757 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:15:46.759 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:15:58.762 [main] INFO com.example.demo.Bucket4jTest – do remote call
23:16:10.765 [main] INFO com.example.demo.Bucket4jTest – do remote call
前面 5 个 token 消耗完之后,后续每隔 12 秒消耗一个 token
小结
bucket4j 类库是一款优秀的 java 限流类库,可以用来限流,也可以用作简单调度。
doc
Basic usage examples