微服务限流实战
一、业务场景什么情况下必须限流1.突发流量场景秒杀 / 抢购活动期 QPS 2000日常 QPS 10-50→ 突发 40 倍流量必须限流项目实战季度结息活动凌晨 0 点开放——QPS 从 50 飙到 3000——没有限流系统就崩了。2.恶意攻击防护恶意 IP 疯狂请求 → 限流保护压测得到系统最大 QPS → 设上限系统压测最大 QPS 1500——限流阈值设 1200——保留 20% 缓冲给突发流量。二、Nginx 限流2 大经典场景1.控制速率漏桶算法应对突发流量—让请求以固定速率处理# nginx.confhttp { # 定义限流区域10MB 内存每秒 1 个请求 limit_req_zone $binary_remote_addr zoneone:10m rate1r/s; server { location /api/ { # ⚠️ burst5 允许突发 5 个请求nodelay 不延迟立即处理 limit_req zoneone burst5 nodelay; proxy_pass http://backend; } }}关键参数rate1r/s每秒 1 个请求burst5允许突发 5 个漏桶缓冲nodelay突发请求立即处理不排队Mavis 实战注释⚠️$binary_remote_addr按 IP 限流⚠️zoneone:10m10MB 内存够记 16 万 IP2.控制并发数http { # 限制每个 IP 并发连接数 10 limit_conn_zone $binary_remote_addr zoneaddr:10m; server { location /api/ { limit_conn addr 10; proxy_pass http://backend; } }}limit_req 控制速率limit_conn 控制并发数三、网关限流Spring Cloud Gateway Sentinel1.核心配置# application.ymlspring: cloud: gateway: routes: - id: limit_route uri: lb://backend-service predicates: - Path/api/** filters: # ⚠️ 令牌桶算法每秒填充 100 个桶容量 200 - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 100 # ⚠️ 每秒填充速率 redis-rate-limiter.burstCapacity: 200 # ⚠️ 令牌桶总容量 key-resolver: #{ipKeyResolver} # ⚠️ 按 IP 限流2.KeyResolver 配置按 IP 或路径Configurationpublic class RateLimiterConfig { Bean public KeyResolver ipKeyResolver() { return exchange - Mono.just( exchange.getRequest().getRemoteAddress().getAddress().getHostAddress() ); } Bean public KeyResolver pathKeyResolver() { return exchange - Mono.just( exchange.getRequest().getPath().value() ); }}按 IP 限流防恶意攻击按路径限流保护热点接口——两个 KeyResolver 配合用。四、限流 4 大经典算法1.固定窗口计数器最简单时间窗口1 秒限流阈值100 QPS第 1 秒请求 1-100 通过第 101 个拒绝第 2 秒计数器清零重新开始优点实现简单缺点窗口边界突刺1 秒末 2 秒初 200 QPS超阈值 2 倍2.滑动窗口计数器改进版把 1 秒分成 5 个 200ms 小窗口每个小窗口独立计数总请求 最近 5 个小窗口之和优点平滑限流避免边界突刺缺点窗口越多内存越大3.漏桶算法Nginx 用这个请求 → 漏桶 → 处理固定速率 ↓ 桶满 → 拒绝特点强制恒定速率处理——保护下游——适合流量整形Mavis 注解⚠️漏桶 整流——流量再大出去也是匀速⚠️适合保护下游系统——不能让下游被打挂4.令牌桶算法Spring Cloud Gateway 用这个令牌桶 → 匀速生成令牌 → 请求拿令牌 → 处理 ↓ 桶满 → 丢弃令牌特点允许突发流量——桶里存多少就能突多少Mavis 注解⚠️令牌桶 蓄洪——平时攒令牌大流量来了能扛一阵⚠️秒杀 / 抢购首选——应对突发5.4 大算法对比表算法原理优点缺点适用固定窗口1 个大窗口计数实现简单边界突刺不推荐生产滑动窗口N 个小窗口求和平滑内存占用金融首选漏桶匀速处理保护下游无法应对突发流量整形令牌桶匀速生成令牌可突发实现复杂秒杀抢购记忆口诀漏桶整流令牌蓄洪固定窗口有边界突刺滑动窗口平滑秒杀用令牌金融用滑动五、3 大经典面试追问追问 1为什么用令牌桶不用漏桶秒杀场景允许突发——令牌桶攒令牌能扛突发流量。漏桶强制匀速——秒杀高峰用户体验差。追问 2限流阈值怎么定压测得到系统最大 QPS 1500限流阈值设 1200——保留 20% 缓冲——给 GC / 网络抖动留余量。追问 3网关限流和 Nginx 限流什么区别Nginx 限流在最外层——防大流量直接打挂网关。网关限流在业务层——按用户 / IP / 路径细粒度控制。两层配合用——Nginx 先挡 80% 恶意流量网关再细控业务。六、记忆口诀秒杀令牌流量整形漏桶Nginx 外层挡恶意流量网关内层细控limit_req 速率limit_conn 并发令牌桶 replenishRate burstCapacityQPS 1500 时限流设 1200留 20% 缓冲滑动窗口防边界突刺金融首选高并发限流体系建设双层限流Nginx最外层 Spring Cloud Gateway Sentinel业务层算法选型令牌桶应对突发 滑动窗口金融合规实战季度结息 QPS 从 50 飙到 3000限流后系统稳定配置replenishRate100 burstCapacity200保留 20% 缓冲按 IP 路径双维度限流防恶意攻击 保护热点接口