分布式限流
一、核心原理分布式限流的核心在集群多台机器上统一控制总请求速率而不是每台机器各自限流。分布式限流核心原理① 所有请求共享同一个计数器 / 令牌桶② 计数必须原子化多线程 / 多机器不冲突③ 统一存储Redis最主流④ 执行必须高效用 Lua 脚本保证原子性一句话总结Redis Lua 脚本 分布式限流标准方案二、最常用的 3 种实现方式1. Redis Lua固定窗口限流最简单通用-- key限流key如接口名/用户ID -- max最大允许数 -- ttl时间窗口秒 local count redis.call(incr, KEYS[1]) if count 1 then redis.call(expire, KEYS[1], ARGV[1]) end if count tonumber(ARGV[2]) then return 0 -- 超过限流拒绝 end return 1 -- 放行原理单位时间如 1 秒最多允许 N 个请求用 Redis 做全局计数Lua 脚本保证判断 计数 过期原子执行无并发问题优点实现最简单、性能极高适用绝大多数接口限流、网关限流、IP 限流2. Redis Lua令牌桶限流支持突发流量原理桶里固定容量令牌每秒固定放入 N 个令牌请求拿走一个令牌没有就拒绝适用电商、秒杀、允许瞬时流量突增3. 成熟框架不用写代码直接集成如果不想写 RedisLua直接用现成框架1) Sentinel阿里出品推荐原理默认「滑动窗口」同时支持令牌桶、漏桶位置服务内部资源层可在网关、业务接口、方法、热点参数上使用Sentinel。粒度细粒度资源接口 / 方法、QPS、并发线程、热点参数、链路 / 关联限流。目的服务级精准防护、熔断降级、流量塑形。依赖单机可独立运行分布式可结合 Redis/Nacos 等。2) Spring Cloud Gateway原理Redis 存令牌固定用「令牌桶」按速率生成桶有容量允许一定突发。位置网关层入口所有请求先到网关。粒度粗粒度按路由 / 接口 / IP / 用户限流。目的全局流量削峰、挡大流量、保护整个微服务集群。依赖必须配合Redis Lua做分布式计数。--yaml文件 filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒生成10个 redis-rate-limiter.burstCapacity: 20 # 桶最大20个3) RedissonRedis 官方推荐的 Java 客户端轻松实现分布式锁 分布式限流 高并发可靠性自带RRateLimiter一行代码实现分布式限流public boolean tryAccess() { // 限流 key RRateLimiter rateLimiter redissonClient.getRateLimiter(limit:api:getOrder); // 规则每秒生成 10 个令牌 rateLimiter.trySetRate(RateType.OVERALL, 10, 1, RateIntervalUnit.SECONDS); // 尝试获取 1 个令牌 return rateLimiter.tryAcquire(1); }三、关键点为什么必须用 Lua避免多机并发导致计数不准保证原子性。为什么用 Redis高性能、内存操作、集群统一计数。固定窗口 vs 滑动窗口固定窗口简单但临界值可能突刺滑动窗口更平滑适合严格限流分布式限流一定放在哪里网关层Gateway/Nginx统一控制不要每个服务自己实现。