Java 中常用的限流算法主要有以下四种经典算法每种算法适用于不同场景。同时主流的限流框架也大多基于这些算法实现。以下是详细整理一、四大经典限流算法原理 Java 特点算法原理简述优点缺点典型适用场景1. 固定窗口计数器Fixed Window Counter将时间划分为固定窗口如1秒统计窗口内请求数超限拒绝实现简单AtomicInteger / Redis INCR临界突刺问题相邻窗口交界处可能瞬间翻倍流量活动防刷、低精度限流2. 滑动窗口Sliding Window将大窗口拆为多个小窗口如60个1秒组成1分钟动态统计最近N个小窗口总和精度高缓解边界突刺内存开销大需维护时间戳或环形数组高并发接口限流如Sentinel3. 漏桶算法Leaky Bucket请求入桶系统以恒定速率“漏水”处理请求桶满则丢弃新请求强制平滑输出保护下游无法应对合法突发流量Nginx限流、文件下载限速4. 令牌桶算法Token Bucket以固定速率向桶中加令牌请求需消耗令牌桶满则丢弃多余令牌支持突发流量 控制平均速率实现稍复杂需计算时间差补令牌API网关、用户侧限流最常用二、主流 Java 限流框架及其采用的算法框架/组件采用的限流算法特点说明适用层级Guava RateLimiter令牌桶单机内存实现轻量、无外部依赖支持tryAcquire()和acquire()单机限流Sentinel阿里开源滑动窗口为主也支持令牌桶、漏桶提供熔断、降级、系统保护支持动态规则、Dashboard监控微服务接口级限流Resilience4j滑动窗口 信号量隔离轻量级与 Spring Boot 深度集成支持响应式编程服务层限流Spring生态Redis Lua自研可实现固定窗口、滑动窗口、令牌桶利用 Redis 原子性INCR/ZSET/Lua实现分布式限流分布式限流RedissonRRateLimiter令牌桶分布式基于 Redis 的分布式令牌桶支持公平模式分布式限流Spring Cloud Gateway默认支持Redis 令牌桶/滑动窗口通过RequestRateLimiterGatewayFilterFactory集成 Redis 实现网关层限流网关层限流Nginx漏桶算法limit_req模块高性能反向代理适合入口流量整形网关/边缘限流Kong API Gateway支持多种算法含令牌桶可插件化基于 OpenResty支持 Redis 集群存储限流状态网关层限流Istio / Envoy令牌桶全局限流需 gRPC 服务云原生服务网格无侵入式限流服务网格层限流三、选型建议结合场景场景推荐方案单机应用、快速原型Guava RateLimiter令牌桶微服务、需熔断/监控Sentinel滑动窗口 动态配置Spring Boot 项目Resilience4j 或 Spring Cloud Gateway Redis分布式集群限流Redis Lua滑动窗口 或 Redisson令牌桶网关统一限流Nginx漏桶、Kong、Spring Cloud Gateway云原生/K8s 环境Istio Envoy服务网格限流四、补充算法 vs 框架 对照表算法代表框架/实现固定窗口自定义计数器、Redis INCR滑动窗口Sentinel、Resilience4j、Redis ZSET漏桶Nginxlimit_req、部分自研队列实现令牌桶Guava、Redisson、Spring Cloud Gateway、Istio/Envoy✅总结令牌桶是目前最主流的算法兼顾突发与平均速率被 Guava、Redisson、网关等广泛采用。滑动窗口在需要高精度限流的场景如 Sentinel中更优。漏桶适合严格平滑输出的后端保护场景。固定窗口仅用于简单或临时限流。如需具体代码示例如 Guava 使用、Redis Lua 脚本、Sentinel 配置等可进一步说明场景我可以提供完整实现。