限流为什么不能只在网关层做?

分布式系统中,网关限流只是第一道防线。真正消耗资源的是内部服务——线程池、数据库连接、下游调用。只有构建多层级限流体系,才能实现真正的系统保护。

🔵 单机限流 🟣 集群限流 🔴 突发流量 🟠 核心接口
Q

面试问题背景

这是一道高频后端面试题,考察的是对分布式系统限流架构的深层理解。

💬 面试官追问的四个方向

当你说出「网关限流」后,面试官会继续追问:单机限流 vs 集群限流突发流量处理核心接口保护——这四个方向缺一不可。

🖥️

单机限流

Guava RateLimiter、Semaphore 本地限流,轻量但无全局视角

🌐

集群限流

Redis + Lua 滑动窗口 / 令牌桶,分布式环境下保证总量控制

突发流量

冷启动、热点事件导致的瞬时流量洪峰,需要预热与缓冲机制

🛡️

核心接口

支付、下单等高价值接口需要更严格的独立限流策略

客户端 API 网关 全局入口限流 ⚠️ 只挡粗粒度流量 服务 A 订单服务 服务 B 用户服务 服务 C 支付服务 MySQL 连接池耗尽? Redis 第三方 API 有自身限额! ⚠️ 这些地方网关管不到!

为什么网关限流远远不够

网关是系统的「大门保安」,但它看不到屋子里面发生了什么。

🔴 核心论点:网关只能做「粗粒度」拦截

网关限流的本质是按路由维度(如每秒 1000 QPS 到订单服务)做总量控制。但一个请求进入服务后,可能触发多次数据库查询、多个下游 RPC 调用——这些真正的资源消耗点,网关完全不可见。

1

网关看到的只是「请求数」,不是「资源消耗」

一个简单查询可能只占 5ms CPU,而一个复杂聚合接口可能占用 500ms + 3次 DB 查询 + 2次 RPC。同样 1 个 QPS,资源消耗差 100 倍。网关无法区分。

2

内部服务间调用绕过了网关

微服务架构中,服务 A 调用服务 B 是内部 RPC,不经过 API 网关。如果服务 A 出现故障重试风暴或逻辑 bug 导致循环调用,网关完全感知不到,直接把服务 B 打挂。

3

不同接口的资源敏感度不同

「查看商品列表」和「提交订单」不能共用同一个限流阈值。前者可以降级返回缓存,后者涉及库存扣减和资金流转。核心接口需要独立的、更精细的限流策略

🔵 网关视角(只能看到这些) 来源 IP / 用户 ID → QPS 计数 目标路由路径 → 分流配额 HTTP Header / 参数 → 粗粒度规则 ❌ 看不到:DB 连接数 ❌ 看不到:线程池状态 🟣 服务视角(真正需要保护的) ✅ 线程池活跃数 / 队列长度 ✅ 数据库连接池使用率 ✅ 下游依赖 RT / 错误率 ✅ JVM GC 频率 / 内存水位 ✅ 单接口级别的 QPS / 并发 差距
⚙️

内部服务才是真正消耗资源的地方

一个请求经过网关后,在内部服务中会触发大量资源操作——这些才是限流的真正目标。

🟢 关键认知:限流的本质是保护「有限资源」

系统中的每一种资源都是有限的:线程池大小、数据库连接数、Redis 连接池、第三方 API 配额。限流的目的是让资源消耗不超过承载能力,而不是简单地限制请求数量。

🎯 内部服务 (真正消耗资源的地方) ← 必须在此处限流! 📄 具体接口 每个 API 方法级别 🔄 线程池 Tomcat/业务线程池 🗄️ DB 连接池 HikariCP / Druid 🔗 下游依赖 RPC / HTTP 第三方 📡 内部 RPC Feign / Dubbo 调用 💾 缓存层 Redis / 本地缓存

💡 经典故障案例:网关限流 10000 QPS,服务还是被打挂了

环节 配置 实际瓶颈 问题
API 网关 限流 10,000 QPS 网络带宽 ✅ 正常工作
订单服务 无线程池保护 Tomcat 默认 200 线程 ❌ 全部阻塞在 DB 查询上
MySQL 连接池 max=100 慢 SQL 占满连接 ❌ 新请求全部排队等待
库存服务(RPC) 无限流 被上游打爆 ❌ 雪崩传播
📊

容量模型 —— 限流参数的本源依据

限流阈值不是拍脑袋决定的,而是基于系统容量模型科学计算出来的。

📐 容量模型 (Capacity Model) 🕐 每秒允许 10,000 ⚡ 突发流量 +2,000 🔄 超限恢复 平滑过渡

🧮 容量模型的三大决定因素

设置限流参数时,必须同时考虑以下三个维度,任何一个被忽略都会导致限流失效:

🔗

接口并发承受力

当前硬件条件下,该接口最大能承受多少并发而不出现明显延迟上升?通过压测获得基准数据。

📉

下游调用承受力

依赖的 MySQL、Redis、第三方 API 各自有何限制?木桶效应——最短板决定了整体上限。

😤

拒绝后用户体验

触发限流后返回什么?429 Too Many Requests?排队等待?降级兜底?直接影响用户满意度。

🏗️

多层级限流体系设计

正确的做法是在系统的每一层都部署适合该层的限流策略,形成纵深防御。

Layer 1 · 网关层限流 全局入口流量控制 | Nginx / Spring Cloud Gateway / Kong 按路由/IP/用户 限流 防 DDoS / 爬虫 黑白名单过滤 粗粒度:全局限流阈值 Layer 2 · 服务层限流 应用实例级别 | Sentinel / Resilience4j / Guava RateLimiter 单机 QPS 限制 线程池隔离 信号量隔离 细粒度:实例级精确控制 Layer 3 · 接口/方法级限流 具体 API 方法级别 | @SentResource / 注解式配置 热点参数限流 核心接口独立阈值 集群总量控制 最细粒度:方法级精准限流 Layer 4 · 资源层保护 基础设施层面 | 连接池配置 / 熔断器 / 降级策略 DB 连接池上限 Redis 连接池上限 熔断器 (Circuit Breaker) 自动降级策略 最后防线

✅ 四层协同的效果

每一层解决不同粒度的问题:网关层挡住恶意流量和全局超载 → 服务层保护单个实例不被击穿 → 接口层为核心 API 提供精细保护 → 资源层作为最后防线防止底层资源枯竭。任何一层失守,下一层还能兜底。

⚙️

限流算法选型与边界问题

不同算法适用于不同场景,选择错误会导致严重的边界效应。

⚠️ 固定窗口算法的「边界突刺」问题 00:00 00:01 00:02 00:03 00:04 窗口 1 (限额 100) 100 请求 ✅ 窗口 2 (临界点!) 100 100 ⚠️ 1秒内涌入了 200! 正常:每窗口 ≤ 100 突变:临界点 2倍突刺!
算法 原理 优点 缺点 / 注意事项 适用场景
固定窗口 统计固定时间窗口内请求数 实现简单,内存占用低 边界突刺问题 非严格精度要求的场景
滑动窗口 将大窗口切分为小格子滚动 精度高于固定窗口 内存稍高,实现复杂度中等 大多数生产环境首选
令牌桶 以固定速率放入令牌,请求取令牌 允许突发流量,平滑限流 突发量受桶容量限制 允许一定弹性的业务
漏桶 请求进队列,固定速率处理 绝对匀速输出 不适应突发,可能有延迟 需要严格速率控制的场景
滑动日志 记录每个请求时间戳,滑动统计 最高精度 内存消耗大,O(n)复杂度 超高精度要求场景

🎯 选型建议

网关层:令牌桶或滑动窗口(兼顾精度与性能)→ 服务层:滑动窗口 + 热点参数限流 → 接口层:Sentinel 的热点规则(支持参数级别)→ 资源层:熔断器(半开/全开/关闭三态自动切换)。

🎯

典型场景与应对策略

🔴 秒杀 / 抢购场景

  • 前端:按钮置灰 + 验证码拦截机器人
  • 网关层:按用户ID 严格限流(如 1次/秒)
  • 服务层:Redis 预扣库存(原子递减)
  • 接口层:队列削峰 + 异步下单
  • 资源层:只读副本分流读流量

🔵 开放 API 平台

  • 网关层:AppKey + AppSecret 鉴权 + 分级限流
  • Bronze: 100 QPM / Silver: 1000 QPM / Gold: 10000 QPM
  • 服务层:按租户 ID 做隔离限流
  • 接口层:核心写接口额外降低阈值
  • 监控:实时告警 + 自动升降级

🟣 微服务内部调用

  • Feign/Dubbo 调用方:设置超时 + 重试次数上限
  • 被调用方:信号量隔离(快失败)
  • 熔断器:错误率 > 50% 触发熔断
  • 降级:返回默认值 / 缓存数据 / 友好提示
  • 禁止链路重试风暴(重试指数退避)

🟠 第三方依赖保护

  • 外部 API 有自己的限额(如微信支付)
  • 本地限流必须 < 外部限额(留 buffer)
  • 适配器模式统一封装 + 限流 + 降级
  • 调用失败时的 fallback 策略
  • 监控外部服务的可用性和延迟趋势
🏆

总结:面试高分回答框架

✅ 一句话结论

网关限流只能做粗粒度的全局流量控制,真正消耗资源的是内部服务的线程池、数据库连接、下游调用——这些必须在服务内部进行精细化限流保护。正确的架构是多层级限流:网关层 → 服务层 → 接口层 → 资源层,四层协同形成纵深防御。

系统高可用 多层级限流保护 限流 流量控制 熔断 故障隔离 降级 优雅退让 超时 防止阻塞

📝 面试回答要点清单

先肯定网关限流的价值(第一道防线)
指出网关的三大盲区(资源不可见/内部调用绕过/粒度太粗)
引出内部服务的四大资源消耗点
给出容量模型的三个计算维度
画出四层限流架构图并解释每层职责
对比五种算法,指出固定窗口的边界突刺问题
结合具体场景(秒杀/开放API/微服务)给出方案
强调限流+熔断+降级+超时四位一体