短信运营黑名单号码过滤全解析:风险来源、核心误区与落地解决方案
2026/6/25 21:16:34
【免费下载链接】bucket4jJava rate limiting library based on token-bucket algorithm.项目地址: https://gitcode.com/gh_mirrors/bu/bucket4j
Bucket4j是一款基于令牌桶算法的Java限流库,能够有效保护系统免受突发流量冲击。本文将带你从零开始掌握这个强大的Java限流工具。
令牌桶算法就像一个智能的水龙头,它以固定速率向桶中加水(令牌),当请求到来时,需要从桶中取水(令牌)才能通过。如果桶空了,请求就会被限流。这种机制既保证了系统的稳定性,又不会完全拒绝服务。
import io.github.bucket4j.Bucket; import io.github.bucket4j.Bandwidth; import java.time.Duration; // 创建每秒处理10个请求的令牌桶 Bucket bucket = Bucket.builder() .addLimit(Bandwidth.simple(10, Duration.ofSeconds(1))) .build();// 尝试消费一个令牌 if (bucket.tryConsume(1)) { // 允许处理请求 processRequest(); } else { // 请求被限流 return "请求过于频繁,请稍后再试";// 每分钟最多100次调用,突发不超过200次 Bucket apiBucket = Bucket.builder() .addLimit(Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(1)))) .build();// 用户每分钟最多发送5条消息 Bucket userBucket = Bucket.builder() .addLimit(Bandwidth.simple(5, Duration.ofMinutes(1)))) .build();// 保护数据库连接,每秒最多50个查询 Bucket dbBucket = Bucket.builder() .addLimit(Bandwidth.simple(50, Duration.ofSeconds(1)))) .build();桶容量过小会导致频繁限流,过大则失去保护意义。建议根据业务特点设置:
// 间隔补充:每分钟补充100个令牌 Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(1)))); // 贪婪补充:尽可能快地补充令牌 Bandwidth.classic(100, Refill.greedy(100, Duration.ofMinutes(1))));对于频繁访问的接口,可以将Bucket实例缓存起来,避免重复创建:
private static final Map<String, Bucket> bucketCache = new ConcurrentHashMap<>(); public static Bucket getBucket(String key) { return bucketCache.computeIfAbsent(key, k -> Bucket.builder() .addLimit(Bandwidth.simple(20, Duration.ofSeconds(1)))) .build() ); }原因:可能在不同地方创建了多个Bucket实例解决:确保使用同一个Bucket实例进行令牌消费
// 使用Redis实现分布式限流 ProxyManager<String> proxyManager = Bucket4jRedis.lettuceBased() .withClient(redisClient) .build(); Bucket bucket = proxyManager.builder() .addLimit(Bandwidth.simple(100, Duration.ofMinutes(1)))) .build(key, configuration);使用带宽的capacity参数来允许突发:
Bandwidth bandwidth = Bandwidth.simple(100, Duration.ofMinutes(1))) .withInitialTokens(50); // 允许初始突发@Test public void testRateLimiting() { Bucket bucket = Bucket.builder() .addLimit(Bandwidth.simple(5, Duration.ofMinutes(1)))) .build(); // 连续消费6次,第6次应该失败 for (int i = 0; i < 5; i++) { assertTrue(bucket.tryConsume(1)); } assertFalse(bucket.tryConsume(1)); }Bucket4j作为一个轻量级且功能强大的Java限流库,能够有效保护你的系统免受流量冲击。通过本文介绍的配置技巧和最佳实践,你可以快速上手并应用到实际项目中。记住,好的限流策略应该既保护系统,又不会过度限制正常用户的访问。
【免费下载链接】bucket4jJava rate limiting library based on token-bucket algorithm.项目地址: https://gitcode.com/gh_mirrors/bu/bucket4j
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考