想象你管理着一座拥有 500 家店铺的巨型购物中心。开业之初,每家店都自己开一扇门直通大街,顾客想去哪家就推门进哪家,店主自己验会员、自己控制客流、自己记账。但随着店面越来越多,问题接踵而至:顾客在迷宫般的街道间迷路、各家店重复建设安保和收银系统、小偷四处流窜、管理层连“今天到底来了多少人”都说不清。 于是你决定建造一座中央总服务台——所有顾客从统一大门进场,在这里验证会员卡、被指引到心仪店铺的位置、高峰期门口分批放行、特殊区域有安保巡逻和广播预警。这座总服务台,就是微服务世界里的 API Gateway(API 网关)。 在微服务架构中,服务被拆成几十上百个,客户端如果直连每个服务,既要维护一大堆地址、又要分别处理认证和限流,成本完全失控。API 网关就是那个“总服务台”:它统一接收所有外部请求,负责任务分发、身份核验、流量管控和运行监控,让背后的微服务安心做好自己的生意。接下来,我们沿着这座总服务台的蓝图,逐步拆解它如何工作、如何设计、如何落地。

岗位关联

对 AI 从业者而言,网关是模型推理服务的“第一道门”——掌握它,你才能把 LLM API、推荐系统、风控服务安全稳定地暴露给业务方。

目录
  1. 可视化演示
  2. 网关概念
  3. 核心功能
  4. 路由机制
  5. 设计模式
  6. 主流实现
  7. 部署架构
  8. 实践要点
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示API Gateway的核心机制,通过概览/流程/对比/趋势四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

API Gateway:API网 API网关核心功能与微服务架构 API路由与请求转发机制 核心机制可视化 API Gateway整体架构与关键组件

网关概念

想象过去的商业街:每个店铺都对着大街开门,顾客直接进店,店主各自管账、各自安保。这就是单体应用时代的“直连”——客户端只需要知道几个服务的地址就行。可当一家公司把业务拆成几十个微服务后,客户端要维护几十个地址、处理几十种协议、和每个服务分别做认证——这就像一条街上突然开了 500 家店却没有任何统一入口,顾客会彻底迷路,管理也会失控。

微服务架构的本质是把“大而全”拆成“小而专”,但拆分也带来了新问题:服务地址频繁变动、重复的横切逻辑(认证、限流、日志)散落在各个服务里、客户端与内部结构过度耦合。于是 API 网关应运而生,它成为所有外部流量进入微服务系统的统一入口。客户端只需要知道网关的地址,剩下的路由、认证、限流都由网关代劳,内部服务甚至可以藏在内网,不对外直接暴露。

从数据流的角度看,网关把所有客户端请求汇聚在了一起。假设有 $n$ 个客户端,每个客户端每秒产生 $q_i$ 个请求,那么网关入口的每秒总流量就是:

这座“总服务台”不仅收拢了客流,更把“验票、指路、控流”这些本属于各店铺的重复工作全部收归一处。有了它,商场里的每家店铺才能安心做好自己的商品和服务——这正是微服务网关最根本的价值所在。

Qgateway=∑i=1nqclient(i)\displaystyle Q_{gateway} = \sum_{i=1}^{n} q_{client}^{(i)}
通俗说明:网关入口的总流量等于所有客户端流量之和。它就像一个商场大门,所有顾客必须从这里经过,因此你可以在门口做任何“检查”而不影响店铺内部运营。
  1. 总流量 $Q_{gateway}$它表示网关每秒需要承接的请求总数,是衡量网关容量和限流阈值的核心指标,相当于商场的“每秒到访客流”。
    Qgateway\displaystyle Q_{gateway}
  2. 求和运算符 $\sum$把每个客户端的流量一项一项累加起来。这里的累加意味着“集中汇聚”,正是“统一入口”的数学表达。
    ∑i=1n\displaystyle \sum_{i=1}^{n}
  3. 第 $i$ 个客户端的流量 $q_{client}^{(i)}$每个客户端(手机 App、网页、第三方系统)各自产生的请求速率,就像每个顾客进入商场的频率。
    qclient(i)\displaystyle q_{client}^{(i)}
  4. 客户端的数量 $n$所有接入方的总数。$n$ 越大,网关的汇聚效应越明显,统一治理的价值也越大。
    n\displaystyle n

核心功能

总服务台每天要干四件事:给顾客指路(路由转发)、验证会员卡(身份认证)、高峰期控制入场人流(限流管控)、某区域出问题时广播封锁并引导去别处(熔断降级)。在微服务世界里,这四件事就是网关的核心功能,它们有一个共同的名字——横切关注点,即“每个服务都需要的通用能力”。

路由转发是网关最基础的功能。请求到达网关后,网关根据 URL 路径、请求头等信息,决定该转给哪个微服务,这和“根据顾客想去哪家店,服务台告诉你往哪个方向走”一样。身份认证则负责校验调用者是不是合法用户,常见的做法是验证 JWT Token 或 API Key,就像会员卡和门票必须核验一样。

限流管控是最容易被低估的功能。想象商场周末人潮汹涌,如果不限流,楼道会拥堵甚至发生踩踏。网关会用固定窗口、滑动窗口或令牌桶等算法控制单位时间内的请求数。假设一个时间窗口 $T$ 秒内最多放行 $N$ 个请求,那么限流速率就是:

此外,熔断降级是网关的“安全阀”:当某个微服务持续报错或响应超时,网关会临时切断到该服务的调用,改为返回兜底数据,避免故障像多米诺骨牌一样蔓延到整个系统。这就像商场发现某家店漏电,立刻封锁该区域并广播“请去其他店铺”,防止整栋楼停电。正是这四大功能,让每个微服务只写业务代码,而把通用治理交给网关这门“总闸”。

Rlimit=NT\displaystyle R_{limit} = \frac{N}{T}
通俗说明:限流速率 = 窗口内放行数 ÷ 窗口时长。就像商场规定“每秒钟最多放 50 人进门”,超过这个速率就请在门外排队等待。
  1. 窗口时长 $T$限流统计的时间单位,比如 1 秒、1 分钟。它如同商场的“时段划分”,每分钟统计一次入场人数。
    T\displaystyle T
  2. 放行上限 $N$在一个窗口内允许通过的最大请求数,这是业务方根据服务容量测算出的安全值,相当于“每分钟限入 3000 人”的场馆承载上限。
    N\displaystyle N
  3. 限流速率 $R_{limit}$最终得到的每秒许可速率。若实际请求速率低于它,一切照常;高于它,多余的请求会被拒绝或排队,就像闸机挡住超员顾客。
    Rlimit\displaystyle R_{limit}

路由机制

服务台之所以能准确指路,是因为它手里有一份实时更新的“商场地图”;网关之所以知道请求该转给谁,靠的是路由表和服务注册中心。微服务启动时会把自身地址注册到注册中心(如 Nacos、Consul),网关定期从注册中心拉取最新的服务实例列表,这就是动态路由——服务扩容缩容、地址漂移,网关无需重启即可感知。

拿到实例列表后,网关面临一个新问题:3 个订单服务实例,请求到底发给谁?这就轮到负载均衡登场了。最简单的策略是轮询——轮流选一个;更精细的策略是加权轮询,给性能强的机器更高的权重。假设服务 $S$ 有 $n$ 个实例,第 $i$ 个实例的权重为 $W_i$,那么它被选中的概率为:

除了负载均衡,网关还要处理协议转换——内部服务用 gRPC,外部客户端用 HTTP,网关负责“翻译”;以及请求转发的具体细节——包含超时设置、重试机制、请求头传递等。整个路由链路就像商场里的智能摆渡车系统:总服务台查询实时地图、评估各店承载量、把顾客高效分流到最合适的店面。没有这一机制,几百家店会旱的旱死、涝的涝死。

Pi=Wi∑j=1nWj\displaystyle P_i = \frac{W_i}{\sum_{j=1}^{n} W_j}
通俗说明:实例被选中的概率等于它的权重占所有实例权重之和的比例。权重相当于商场给每家分店配的“接待能力分”,分高的店被派去更多顾客,防止小马拉大车。
  1. 第 $i$ 个实例的权重 $W_i$权重表示该实例能承受流量的大小,通常由机器配置、网络带宽等决定,就像同一品牌的两家店,大店每小时能接待 200 人,小店只能接待 50 人。
    Wi\displaystyle W_i
  2. 所有实例权重之和 $\sum_{j=1}^{n} W_j$把全部实例的权重加起来作为分母,用于把各实例的权重归一化到 0~1 之间,确保概率总和为 100%。
    ∑j=1nWj\displaystyle \sum_{j=1}^{n} W_j
  3. 被选中的概率 $P_i$网关在“决定下一单生意给哪个实例”时会按照这个概率分布随机选择。权重越高、被选中的可能越大,但低权重实例仍有机会被选中,这正是负载均衡的精髓。
    Pi\displaystyle P_i

设计模式

当商场规模足够大时,一个总服务台可能不够用:你会设置楼层服务台、VIP 专属通道、团购接待专区。微服务网关也有类似的设计模式,其中最著名的是 BFF(Backend for Frontend,面向前端的后端)模式。

BFF 的核心思想是:不同前端(手机 App、Web 网页、小程序)对数据的需求差异很大。手机端需要精简数据、省流量,网页端需要完整数据、方便调试。如果所有前端都打同一个通用网关,接口设计只能“取最大公约数”,谁都不满意。因此 BFF 为每种前端单独建一个网关,各自定制接口。这就像商场的“1 楼化妆品服务台”和“3 楼儿童区服务台”——各自服务各自的客群,指引更精准。

与 BFF 密切相关的是聚合模式:一个页面往往需要同时从用户服务、订单服务、商品服务拿数据。如果客户端依次调用 3 次,体验差且网络开销大;网关可以在后端并行调用这 3 个服务,把结果聚合成一个响应返回给客户端。假设 $n$ 个子请求全部并行发出,那么聚合接口的总耗时只取决于最慢的那个请求:

在更复杂的系统里,还会出现边缘网关(部署在 CDN 边缘节点,离用户更近)和网关分层(外层流量网关负责限流与安全,内层业务网关负责路由与聚合)。这些模式都遵循同一个理念:像大型商场分区管理一样,把“接待”这件大事拆成不同的专业服务台,各司其职、协同高效。

Taggregate=max⁡(T1,T2,…,Tn)\displaystyle T_{aggregate} = \max(T_{1}, T_{2}, \dots, T_{n})
通俗说明:并行聚合的总耗时 = 最慢子请求的耗时。派 3 个人同时去 3 家店取货,总时间只取决于最慢的那位跑腿员,而不是三个人耗时相加。
  1. 第 $k$ 个子请求耗时 $T_k$网关内部发起的每个子调用的耗时,例如获取用户信息的耗时、获取订单列表的耗时。
    Tk\displaystyle T_{k}
  2. 并行执行多个子请求同时发出,互不等待。这是聚合模式的关键前提——如果串行执行,总耗时将变成 $\sum T_k$,那可就慢了。
    max⁡(T1,T2,…,Tn)\displaystyle \max(T_{1}, T_{2}, \dots, T_{n})
  3. 聚合总耗时 $T_{aggregate}$取所有子耗时中的最大值。这个公式告诉我们:优化聚合接口的重点是找出并优化那个“最慢的商店”,而非平均耗时。
    Taggregate\displaystyle T_{aggregate}

主流实现

买门禁系统时,不同商场会选择不同品牌:有的追求极致性能,有的看重生态集成,有的干脆租用物业统一提供。API 网关的实现方案同样丰富,选型前先想清楚自己的技术栈和团队能力。

Kong 是基于 Nginx 和 OpenResty 构建的高性能云原生网关,支持插件化扩展(认证、限流、日志插件一应俱全),Kubernetes 生态中常通过 Kong Ingress Controller 使用。Spring Cloud Gateway 是 Java 技术栈的事实标准,基于 WebFlux 响应式编程,与 Spring Cloud 注册中心(Nacos/Eureka)无缝集成,适合大规模 Java 微服务。Zuul 是 Netflix 开源的老牌网关,经历过从 Zuul 1.x(阻塞式)到 Zuul 2.x(异步非阻塞)的演进,虽然现在风光不如从前,但存量系统仍大量使用。云托管网关(如 AWS API Gateway、阿里云云原生 API 网关)则提供免运维的托管服务,内置限流、鉴权、监控甚至计费能力,适合中小团队快速起步。

无论选哪款实现,都要关注网关引入的额外延迟。一次请求从客户端发出,要经历网络传输、网关处理、服务处理三段耗时:

选择网关实现不是“越贵越好”,而是“匹配即最优”:Java 团队选 Spring Cloud Gateway 学习成本低,云原生团队选 Kong 拓展性强,不愿意运维的直接上云托管。就像不同定位的商场选择不同的门禁品牌,但最终目的都是让顾客顺畅进门。

Ttotal=Tnetwork+Tgateway+Tservice\displaystyle T_{total} = T_{network} + T_{gateway} + T_{service}
通俗说明:端到端总耗时 = 网络耗时 + 网关耗时 + 服务耗时。网关相当于总服务台里的“问路环节”,如果问路时间太长,顾客整体体验就会被拖累,所以网关必须轻量、高效。
  1. 网络耗时 $T_{network}$请求在客户端与网关、网关与服务之间的网络传输时间,受物理距离和带宽影响,相当于顾客走到服务台的路程时间。
    Tnetwork\displaystyle T_{network}
  2. 网关处理耗时 $T_{gateway}$网关执行路由、认证、限流等逻辑消耗的时间。选型核心指标之一,框架性能差异主要体现在这里。
    Tgateway\displaystyle T_{gateway}
  3. 服务处理耗时 $T_{service}$后端微服务真正执行业务逻辑的耗时,通常是三段中占比最大的部分。这个公式提醒我们:网关的开销必须被严格压到最小,不能成为新的瓶颈。
    Tservice\displaystyle T_{service}

部署架构

一座超大型商场不可能只有一个入口:四面都有大门、地下车库直通、地铁层也有通道。为了保证任何方向来的顾客都能顺畅进入,你会部署多个门岗协同工作。API 网关同样需要集群部署——部署多个网关实例,前面挂负载均衡器统一分发流量,避免单点故障。

网关集群的核心要义是无状态:每个网关节点不保存用户的会话状态(Session),所有状态落在共享的认证中心或 Redis 里,这样任何节点都能处理任意请求。理论上,如果每个网关节点每秒能处理 $Q_{node}$ 个请求,集群有 $N_{node}$ 个节点,那么集群总吞吐量近似为:

在部署架构中,网关还需要与注册中心集成,保证路由表实时更新;与配置中心和日志平台打通,实现统一配置下发和链路追踪。更大型的系统会采用多级网关:入口的流量网关只管全局限流和防攻击,内部的业务网关负责具体路由和聚合。同时要重视东西向流量——微服务之间的互相调用也需要安全管控,不能只盯着南北向的外部流量。这就像商场不仅要管好大门,还要在各楼层安排巡逻保安,才能做到全方位安全。

Qcluster=Nnode×Qnode\displaystyle Q_{cluster} = N_{node} \times Q_{node}
通俗说明:集群总吞吐量 ≈ 节点数 × 单节点吞吐量。就像商场开了 4 个入口,每个入口每秒进 50 人,总进人速度就是每秒 200 人——当然,前提是 4 个入口能力一致且互不干扰。
  1. 节点数 $N_{node}$网关实例的数量,通常由流量峰值决定。大促前扩容网关节点是常规操作,就像节假日商场会临时增开安检通道。
    Nnode\displaystyle N_{node}
  2. 单节点吞吐量 $Q_{node}$单个网关实例每秒能处理的请求数,取决于硬件配置和网关框架性能。
    Qnode\displaystyle Q_{node}
  3. 集群总吞吐量 $Q_{cluster}$所有节点叠加后的处理能力。注意这个公式成立的前提是负载均衡策略有效、节点之间无共享瓶颈,否则集群性能会打折扣。
    Qcluster\displaystyle Q_{cluster}

实践要点

商场总服务台上线只是开始,持续运营才是长期挑战。你会发现某些时段客流暴增、某些指引路线绕路、偶尔还会出现停电等突发状况,这些都对应着网关的性能优化、日志监控、灰度发布和故障演练四大实践。

性能优化的要点包括:开启 HTTP 连接复用(Keep-Alive)、使用异步非阻塞模型减少线程占用、对频繁读取的配置和路由做本地缓存。日志监控则要求网关输出完整的访问日志和慢请求告警,通过 Prometheus 采集指标、通过 Jaeger/Zipkin 做链路追踪——没有这些“监控探头”,商场管理者就会变成瞎子。灰度发布是上线新功能时最稳妥的做法:先让一小部分流量走新版本,验证无误后再逐步放量。

灰度发布必须用数据说话。假设灰度批次内共有 $N_{total}$ 个请求,其中 $N_{success}$ 个成功返回,那么该批次成功率是:

最后,故障演练是“防火演习”——定期模拟服务宕机、网络抖动、限流触发等场景,验证网关的熔断和降级策略是否真的生效。每一次演练后的复盘,都是对总服务台流程的优化。记住:网关不是建完就完事的静态建筑,而是需要持续打磨的“商场大脑”。

---

Srate=NsuccessNtotal×100%\displaystyle S_{rate} = \frac{N_{success}}{N_{total}} \times 100\%
通俗说明:灰度成功率 = 成功请求数 ÷ 总请求数 × 100%。如果成功率低于预设阈值(如 99.9%),就立即回滚,就像新改造的楼层导视系统先让 10% 顾客试用,发现带错路立刻撤下。
  1. 成功请求数 $N_{success}$灰度期间返回状态码正常的请求数量,它是衡量新版本健康度的直接指标。
    Nsuccess\displaystyle N_{success}
  2. 总请求数 $N_{total}$灰度流量池内所有请求的总数,包括成功、失败、超时的全部样本。
    Ntotal\displaystyle N_{total}
  3. 成功率 $S_{rate}$以百分比形式呈现的转化指标。$S_{rate}$ 越接近 100%,灰度批次越健康;一旦掉到阈值以下,自动触发回滚机制,把流量切回旧版本。
    Srate×100%\displaystyle S_{rate} \times 100\%

AI 应用场景

LLM 推理服务的统一接入网关

阶段:模型部署与在线推理服务

解决的问题:大语言模型(LLM)推理服务通常部署在 GPU 集群上,成本高且调用模式复杂(流式输出、长上下文、高并发)。如果业务方直接连模型实例,既无法控制成本,也无法对模型版本做灰度切换,更没法按部门做 Token 配额管理。

具体案例:某企业内部部署了 Llama 系列开源模型,通过 API 网关暴露一个与 OpenAI 兼容的 /v1/chat/completions 接口。网关层完成三件事:按部门限流(A 部门每分钟最多 1000 token)、模型路由(请求头带模型名,网关转发到对应 GPU 实例)、成本计量(每个请求消耗的 token 数记录到计费系统)。算法团队升级模型时,只需在网关切换路由权重,实现 0 代码灰度。

智能推荐系统的 BFF 聚合网关

阶段:在线推荐服务的特征聚合与编排

解决的问题:推荐系统的一次请求往往需要同时获取用户画像、召回候选集、排序特征等多路数据。如果让 App 客户端依次调用 3~5 个 AI 服务,首屏延迟会高达数秒,用户体验极差。

具体案例:某电商 App 的“猜你喜欢”页面,采用 BFF 模式部署一个专用推荐网关。App 一次请求进来后,BFF 并行调用画像服务、召回服务、排序服务,将结果聚合为 20 条推荐商品返回。依托 T_aggregate = max(T_i) 的并行聚合策略,首屏耗时从 1.8 秒降到 600 毫秒。

实时风控模型的网关联动

阶段:在线推理与安全策略执行

解决的问题:金融交易场景中,每笔交易在进入业务系统前都需要做实时风控评分。传统做法是业务代码里硬编码风控调用,改一处配一次、效率低且容易漏配;更重要的是,风控策略需要快速迭代,不能每次改规则都发版。

具体案例:某支付平台在 API 网关中集成了风控插件。每笔交易请求先由网关调用风控模型打分,分数低于阈值直接拦截并返回“交易存在风险”的提示;分数处于灰色地带则触发二次验证。整个风控决策不下发到业务服务,策略模型热更新时业务方完全无感知。

Python 演示

python70 行
import time  class ApiGateway:    """Simplified API Gateway: routing + auth + rate limit."""     def __init__(self):        self.routes = {}        self.tokens = {}        self.last_refill = {}        self.rate = 2.0        self.capacity = 5     def register(self, path, handler):        self.routes[path] = handler     def auth(self, token):        return token == "valid-token-123"     def _refill(self, client):        now = time.time()        last = self.last_refill.get(client, now)        delta = now - last        self.tokens[client] = min(            self.capacity,            self.tokens.get(client, self.capacity) + delta * self.rate        )        self.last_refill[client] = now     def allow_request(self, client):        """Token bucket: take one token to pass."""        self._refill(client)        if self.tokens[client] >= 1:            self.tokens[client] -= 1            return True        return False     def dispatch(self, path, token, client="127.0.0.1"):        if not self.auth(token):            return 401, "unauthorized"        if not self.allow_request(client):            return 429, "rate limited"        handler = self.routes.get(path)        if handler is None:            return 404, "path not found"        return 200, handler()  def order_service():    return {"service": "order", "data": "order list"}  def user_service():    return {"service": "user", "data": "user profile"}  def run_demo():    gw = ApiGateway()    gw.register("/api/orders", order_service)    gw.register("/api/users", user_service)     print("=== Fire 8 requests in 0.1s interval ===")    for i in range(8):        code, body = gw.dispatch("/api/orders", "valid-token-123")        print(f"req {i+1}: {code} {body}")        time.sleep(0.1)  if __name__ == "__main__":    run_demo()
目的:用 80 行代码实现一个迷你 API 网关,演示令牌桶限流、Token 认证和路由转发的完整流程。
  1. self.routes = {}路由表,把 URL 路径映射到对应的处理函数,就像服务台手里的商场地图。
  2. self.auth(token)校验调用方身份,相当于总服务台检查会员卡,这里简化为对比一个合法 Token。
  3. def _refill(self, client)令牌桶的核心:按时间流逝往桶里补充请求配额,速率由 self.rate 控制。
  4. self.tokens[client] = min(self.capacity, ...)桶容量封顶,防止积攒过多令牌导致瞬时流量洪峰。
  5. def allow_request(self, client)请求进门必须消耗一枚令牌,消耗不了就返回 429 限流。
  6. if not self.allow_request(client): return 429, "rate limited"这就是“高峰期总服务台暂缓放行”,多余的请求直接吃到限流响应。
  7. handler = self.routes.get(path)按路径从路由表查到目标服务,没查到就返回 404,像服务台找不到对应店铺的指引。
  8. return 200, handler()认证、限流都没问题后,才真正把请求转发给微服务执行并原样返回结果。

常见误区

误区我加一层网关已经多了一次网络跳转,如果再部署多个网关集群,每个请求要经过更多节点,延迟肯定更高,所以一个实例最合适。

正解生产环境必须考虑高可用。网关是系统的单点入口,一旦宕机整个系统不可用——这就像商场只有一个大门,门坏了全商场停业。集群部署配合负载均衡后,请求并不会串行经过所有节点,而是只经过其中一个;单个实例的压力反而变小,性能和可用性都提升。真正的优化方向是压缩单个网关节点的处理延迟,而不是减少节点数。

为何常见:初学者容易把“多节点”误解为“请求要经过多跳”,实际上负载均衡器会把每个请求分发到某一个节点,集群只是多了并行选择。

误区Nginx 也是做转发,API 网关无非就是多几个转发规则,核心工作就是把 HTTP 请求原样扔给后端服务。

正解转发只是网关的起点。网关的核心价值在于把认证、限流、熔断、监控这些横切能力从各个服务中抽离出来集中管理。一个不做事只转发的网关等于只有一个“摆设服务台”,无法承载微服务治理的诉求。Nginx 重性能而轻治理,API 网关则内置了丰富的插件化治理能力。

为何常见:只看到“入站请求→出站转发”的同步链路,忽略了网关在异步、聚合、灰度、安全等策略上的编排能力。

误区所有外部流量都从网关进来,网关已经把坏人挡在门外了,服务之间的内部调用应该默认安全,不用再做鉴权。

正解网关只能管理南北向流量(外部客户端→服务)。而微服务之间的东西向流量(服务→服务)通常不走网关,攻击者一旦攻破一个服务,就能横向渗透到其他服务。正确的做法是:服务间采用 mTLS 双向认证,配合服务网格(如 Istio)实现东西向安全管控。否则就像商场大门安保森严,但内部各店铺之间却不上锁。

为何常见:把“边界防护”和“内部纵深防御”混为一谈,忽视了微服务架构“信任边界”已经下移的现实。

误区上线时把路由规则、限流阈值、证书这些都配好了,后续不用再管它,它自己会稳定运行。

正解网关是需要持续治理的动态系统:新服务上线要加路由、服务扩容要调权重、大促前要调整限流阈值、证书要定期轮换、安全漏洞要打补丁、灰度策略要反复调整。好的团队会把网关配置当作代码资产,纳入版本管理和 CI/CD 流程。没有持续运营的网关,就像从没更新过商场地图——早晚会把顾客带进死胡同。

为何常见:把网关看作静态基础设施,忽略了它与服务生命周期的高度耦合。

面试题

Q1. 在微服务架构中,API 网关通常扮演什么角色?

单选题 · easy

  • A.数据存储层角色
  • B.流量入口层角色← 正确答案
  • C.业务计算层角色
  • D.消息队列层角色

答案:B。API 网关是所有外部流量进入微服务系统的统一入口,负责路由、认证、限流等横切能力,相当于商场的总服务台。它不负责业务计算(选项 C),也不做数据持久化(选项 A)或消息中转(选项 D),因此正确答案是 B。

Q2. 下列哪一项不是 API 网关的核心功能?

单选题 · easy

  • A.路由转发
  • B.身份认证
  • C.动态扩容← 正确答案
  • D.限流管控

答案:C。路由、认证、限流都是网关的经典核心功能。动态扩容是指根据负载自动增减服务实例,这是容器编排平台(如 Kubernetes)或服务治理框架的职责,而不是网关的职责。网关负责“按需调度流量”,不负责“创建新的服务实例”。

Q3. 关于令牌桶限流算法,下列说法正确的是?

单选题 · mid

  • A.完全禁止突发流量
  • B.允许短时突发流量← 正确答案
  • C.只限制非法请求
  • D.必须人工补充令牌

答案:B。令牌桶的特点是桶里预先存放一批令牌,同时以固定速率持续补充。当桶里积攒了令牌时,瞬间可以消耗多枚令牌,因此允许一定程度的突发流量——就像商场高峰期闸机前积累了一批“放行券”,短时间能多放几人。完全禁止突发的是漏桶算法(漏桶固定速率流出),选项 A 错误。

Q4. 网关使用加权轮询做负载均衡时,实例的权重决定了什么?

单选题 · mid

  • A.服务实例的响应速度
  • B.被选中承担请求的概率← 正确答案
  • C.网关路由表的条目数
  • D.服务实例占用的端口数

答案:B。加权轮询中,权重表示实例相对其他实例能承载流量的比例大小,权重越高被选中的概率越大,公式为 $P_i = W_i / \sum W_j$。权重不决定响应速度,也不影响路由表条数或端口占用,因此只有 B 正确。

Q5. BFF 模式要解决的核心问题是什么?

单选题 · mid

  • A.解决数据库读写性能瓶颈
  • B.为不同前端定制聚合接口← 正确答案
  • C.提升后端服务并发上限
  • D.替代服务间的 RPC 协议

答案:B。BFF 的核心是为不同类型的客户端(App、Web、小程序)分别建立后端网关,按各自需求聚合和裁剪数据。手机端更省流量,网页端要完整信息。它不是数据库优化方案,也不替代服务间协议,更不直接提升后端并发,因此选 B。

Q6. 网关对下游服务做重试时,最应该注意什么?

单选题 · hard

  • A.建议用 GET 替代 POST
  • B.确保接口幂等且有限次重试← 正确答案
  • C.重试时去掉请求头认证
  • D.无限次重试直到成功

答案:B。重试最大的风险是“重复下单”:第一次请求实际已经成功,但响应超时,网关重试又发了一次,导致业务被重复执行。因此重试前必须确认接口是幂等的(多次调用结果一致),并设置有限重试次数(如 2~3 次),配合退避策略。无限重试会拖垮下游,去掉认证会导致鉴权失败。正确答案是 B。

Q7. 网关输出的访问日志和监控指标,最常被谁使用?

单选题 · easy

  • A.数据库管理员
  • B.研发和运维团队← 正确答案
  • C.财务部门人员
  • D.一线客服人员

答案:B。网关日志记录了每个请求的路由目标、响应码、耗时、限流次数等关键信息。研发团队用它们排查接口错误,运维团队用它们发现流量异常和容量瓶颈——正如商场的客流数据由运营团队分析。数据库管理员关注的是数据库层指标,财务和客服并不是日志的主要消费者。

Q8. 网关在做限流时,可以基于哪些维度设计限流策略?

多选题 · mid

  • A.客户端 IP 地址← 正确答案
  • B.用户 ID 标识← 正确答案
  • C.API 路径特征← 正确答案
  • D.服务器机箱温度

答案:ABC。限流维度决定了“谁被限”。常见的限流键包括:客户端 IP(防止单个 IP 攻击)、用户 ID(防止单个用户刷接口)、API 路径(对高开销接口单独限流)。服务器机箱温度是硬件监控指标,不会作为业务限流维度,故 D 不选。

Q9. 下列哪些是 API 网关可以承担的职责?

多选题 · mid

  • A.熔断降级保护← 正确答案
  • B.协议格式转换← 正确答案
  • C.请求日志记录← 正确答案
  • D.数据库主从复制

答案:ABC。熔断降级是网关的“安全阀”,协议转换(如 HTTP 转 gRPC)是路由机制的组成部分,日志记录是网关的监控基石。数据库主从复制属于数据层能力,与网关无关——网关只入口流量,不碰数据同步机制,故排除 D。

Q10. 构建网关高可用集群时,需要解决哪些关键问题?

多选题 · hard

  • A.网关实例无状态化← 正确答案
  • B.与注册中心动态集成← 正确答案
  • C.配置同步与健康检查← 正确答案
  • D.压缩集群节点数量

答案:ABC。无状态化保证任意节点可处理任意请求;与注册中心集成保证路由表实时更新;配置同步让所有节点规则一致,健康检查自动摘除故障节点——这三点是高可用集群的基石。压缩节点数量恰恰会降低可用性,除非是为了节省成本而做容量评估,故 D 不选。