微服务限流

📅 2026/7/10 23:54:15
微服务限流
一、限流的核心作用保护服务限制单服务最大处理请求数避免线程池、连接池耗尽削峰填谷突发峰值流量平缓处理防止数据库瞬间压力暴增区分流量保障核心接口、VIP 用户流量丢弃非核心、低频请求防攻击拦截高频爬虫、恶意刷接口节省服务器资源。二、四种主流限流算法1. 固定窗口计数器原理按固定时间窗口1s统计请求总数超过阈值直接拒绝。 优点实现简单Redis incr 即可完成 缺陷临界窗口突刺问题。比如阈值 1000.99s 涌入 100 条1.01s 再涌入 100 条1 秒内实际 200 条超出限制。2. 滑动窗口计数器优化固定窗口把 1 秒拆分成多个小格子滚动统计最近完整窗口总请求。 解决临界突刺但窗口拆分越多内存、计算开销越大Redis 实现复杂度提升。3. 漏桶算法想象水桶请求匀速流出处理流入速度不受控溢出直接丢弃。 特点流出速率固定强制抹平流量峰值适合需要平稳下游压力场景 缺点无法应对突发流量扩容不能应对瞬时高并发。4. 令牌桶算法生产最常用系统按固定速率生成令牌存入桶每个请求必须拿到令牌才能放行桶有最大容量。流量平稳匀速拿令牌正常放行突发流量桶内囤积令牌短时间允许大量请求通过支持流量突增 优点可控制平均速率同时容忍峰值网关、业务服务限流首选 Sentinel 底层默认采用令牌桶。三、微服务分层限流从外到内多层防护线上标准架构1. 网关层限流第一层全局拦截SpringCloud Gateway / Nginx 作用全链路第一道防线拦截恶意流量不用转发到后端服务节省内网资源。 限流维度全平台总 QPS、单 IP、单接口、用户账号。2. 应用服务限流第二层细粒度接口管控使用 Sentinel/Hystrix针对单个接口、核心业务单独限流。 例如下单接口阈值 5000QPS商品详情 10000QPS非核心评价接口仅 1000QPS。3. 分布式限流多实例集群统一限流单机限流只限制单实例多节点部署会失效需要全局统一计数 基于 Redis Lua 脚本实现分布式令牌桶 / 滑动窗口多服务共享限流计数器保证全集群流量可控。4. 底层资源限流兜底数据库连接池、MQ 消费线程数限制防止上层限流失效后压垮存储中间件。四、限流粒度区分不同控制维度全局限流整个服务所有请求总和限制接口粒度针对单个 API 单独设置阈值IP 粒度限制同一客户端 IP 访问频率防爬虫用户粒度登录用户按 userId 限流区分普通用户和 VIP调用方粒度基于服务名限流第三方调用方配额管控。五、流量限流后的四种处理策略快速失败默认直接返回提示 “访问频繁请稍后重试”性能损耗最低排队等待超出流量放入队列缓冲适用于允许少量延迟的业务预热冷启动流量缓慢放开避免服务刚启动瞬间高并发打垮系统降级兜底限流触发直接返回缓存默认数据不抛异常提升用户体验。六、主流技术实现对比1. Nginx 限流基于漏桶单机网关层限流适合前置拦截无分布式能力。2. Spring Cloud Gateway Sentinel网关整合 Sentinel可视化配置流控规则支持预热、IP 限流、分布式限流。3. Sentinel业务服务首选无侵入 / 注解两种接入方式支持令牌桶多种限流粒度控制台动态修改规则无需重启服务限流、熔断、降级、系统保护一体化支持集群分布式限流解决多实例流量均分问题。4. Redis Lua 分布式限流自研方案基于滑动窗口 / 令牌桶适合自定义特殊限流规则 缺点需要自己维护规则、持久化、监控开发成本高。七、生产落地避坑与最佳实践分层限流不能只做一层只做服务限流恶意流量依然会占用网关带宽区分核心 / 非核心接口大促时优先保障下单、支付降低评价、收藏阈值开启预热冷启动服务重启后缓慢释放流量避免冷启动大量请求触发 Full GC集群场景必须开启分布式限流单机限流会被多实例突破阈值限流阈值依据压测结果设置不能凭经验估算限流日志埋点监控配置告警流量突增及时收到通知不要无限排队队列设置最大长度防止内存堆积 OOM。简短总结限流用于控制请求流量、保护服务避免雪崩主流四种算法里令牌桶兼顾平稳与峰值线上最常用微服务采用多层限流架构网关全局限流、应用接口细粒度限流、Redis 分布式集群限流主流工具是 Sentinel支持动态规则、多粒度限流触发限流可快速失败、排队或降级兜底。