1. Bucket4j 簡介
Bucket4j 是一(yi)個靈活的(de) Java 速率(lv)限制庫,基于令(ling)牌桶算法實現。它既(ji)支持單機也支持分布式環境(jing),非(fei)常適用于需(xu)要精細控制請求速率(lv)的(de)應(ying)用程序。
2. 主要特點
- 高性能:Bucket4j 設計優化,可在高負載環境中保持低延遲。
- 靈活的配置:支持多種限速策略,包括固定速率限制和動態調整。
- 分布式支持:可以與多種分布式緩存解決方案整合,例如 Hazelcast、Ignite 和 Redis,支持跨應用和跨節點的速率限制。
- 精細的控制:提供 API 對限速器的每個操作進行詳細控制,如獲取可用的令牌數、嘗試獲取令牌等。
使用方法
基本使用
以(yi)下是一(yi)個簡單的示例(li),展示如何創建一(yi)個令牌(pai)桶(tong)并使用它來限制速率:
import io.github.bucket4j.Bucket;
import io.github.bucket4j.Bandwidth;
import io.github.bucket4j.Bucket4j;
import io.github.bucket4j.Refill;
import java.time.Duration;
public class RateLimiterExample {
    public static void main(String[] args) {
        // 定義每秒可以補充1個令牌的速率
        Refill refill = Refill.greedy(1, Duration.ofSeconds(1));
        // 創建一個容量為10個令牌的桶
        Bandwidth limit = Bandwidth.classic(10, refill);
        Bucket bucket = Bucket4j.builder().addLimit(limit).build();
        // 模擬請求
        for (int i = 0; i < 20; i++) {
            // 檢查是否能立即消費1個令牌
            if (bucket.tryConsume(1)) {
                System.out.println("請求 " + (i + 1) + ": 執行成功 at " + System.currentTimeMillis());
            } else {
                System.out.println("請求 " + (i + 1) + ": 限速 at " + System.currentTimeMillis());
            }
        }
    }
}
分布式限速
若需要在分布式(shi)環境中(zhong)使用(yong) Bucket4j,可以結(jie)合 Redis 等外部(bu)存(cun)儲。以下是一個使用(yong) Redis 存(cun)儲令牌桶狀態的示例:
import io.github.bucket4j.distributed.proxy.ClientSideConfig;
import io.github.bucket4j.grid.jcache.JCache;
import javax.cache.Cache;
import javax.cache.configuration.FactoryBuilder;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
public class DistributedRateLimiter {
    public static void main(String[] args) {
        // 配置(zhi) Redis 連接和緩存(示例中省(sheng)略了具(ju)體配置(zhi)步驟(zou))
        // 獲取對應的 JCache 緩存
        Cache<String, GridBucketState> cache = Caching.getCache("buckets", String.class, GridBucketState.class);
        // 創建分布式令牌桶
        Bucket bucket = Bucket4j.extension(JCache.class).builder()
            .addLimit(Bandwidth.simple(10, Duration.ofSeconds(1)))
            .build(cache, "my_bucket", ClientSideConfig.getDefault());
        // 使用令牌桶限制請求
        if (bucket.tryConsume(1)) {
            System.out.println("請求執行成功");
        } else {
            System.out.println("請求被限制");
        }
    }
}
總結
Bucket4j 是(shi)一個(ge)功能強大的 Java 限(xian)速庫,適用于需(xu)要精確控制(zhi)請求速率的應用。通過靈活的配置和(he)簡(jian)潔的 API,開(kai)發者可以輕松集成并(bing)有(you)效(xiao)使用 Bucket4j 來實現(xian)(xian)應用級別的流量控制(zhi)。無論是(shi)在單(dan)機(ji)還(huan)是(shi)分布式系統中,Bucket4j 都能提供一致(zhi)而可靠(kao)的性能表現(xian)(xian)。