城市里有成千上万的住宅楼,每一栋楼都有自己的住户和访客。如果没有一个统一的管理者,快递员要挨家挨户找门牌号,外卖小哥在楼栋间迷路,推销员畅通无阻地骚扰住户,可疑人员随意进出。于是,小区门口出现了一位门卫——他认识所有住户、登记每个访客、按规则放行、阻止可疑人员、控制人流高峰。这位门卫,就是微服务世界里的“API网关”。 在多微服务架构中,后端拆分成几十上百个独立服务,如果客户端直接访问每一个服务,就像楼栋大门全部敞开,安全隐患巨大、管理极其混乱。API网关(如Kong和APISIX)就是那个小区门卫:所有请求先到它这里,由它统一鉴权、路由、限流、监控,再转发到正确的“楼栋”(服务)里。本文以门卫比喻贯穿全文,带你零基础理解API网关的架构、插件机制、动态配置、性能对比与选型建议。
掌握API网关是后端工程师的必修课。学会Kong/APISIX,你将能独立搭建微服务的统一入口,用配置代替编码实现鉴权限流,成为团队中“门卫系统”的负责人——这是通往架构师之路的关键一步。
可视化演示
展示API网关核心架构(Client→Gateway→Upstream)、插件流水线(rewrite→access→filter→log阶段链)、以及etcd热更新机制(控制面→watch→数据面秒级同步)。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+captions.arch+'
网关的职责
周末的清晨,小区门口排起了长队。快递员、外卖骑手、装修工人、亲戚朋友,全都堵在大门前。没有门卫的时候,每个人都要自己找楼栋,有的人找错楼敲门,有的人在小区里乱转,有的推销员挨家挨户骚扰住户。物业经理痛定思痛,在门口设立了一个门卫岗亭——所有进小区的人必须经过门卫,由他统一安排。
门卫的职责,恰好就是API网关的三重使命。第一,统一入口:所有外部请求只能走小区大门,不能翻墙或钻栅栏。对应架构上,所有客户端请求必须经过网关,不能绕过它直连后端服务。第二,请求转发:门卫根据访客说的楼栋号,告诉他走哪条路、进哪个单元。对应API网关的路由能力,根据URL路径将请求转发给对应的微服务。第三,安全隔离:门卫不会让可疑人员进入小区,也不会让住户的隐私随意泄露给陌生人。对应网关的鉴权和流量控制,保护后端服务不被恶意攻击和突发流量冲垮。
从系统架构来看,API网关部署在所有微服务的最前端,是所有外部流量的必经之地。它像一个漏斗,将无数杂乱的请求收拢、整理、分发。客户端只需要知道网关的地址,不需要知道后端有多少个服务、各自身在何处——这极大地简化了客户端的复杂度,也让后端服务的调整(比如某个服务拆分、迁移、扩容)对客户端完全透明。
物业经理后来发现,自从有了门卫,小区安全事件下降了90%,住户满意度大幅提升。API网关也一样——它不只是“多了一层转发”,而是让整个后端从“杂乱无章的城中村”升级为“管理有序的现代社区”。这,就是网关作为治理门面的价值。
- G 表示网关$G_{\text{gateway}}$ 是 API 网关这个统一入口的符号表示,它是客户端唯一可见的后端地址。
- 并集符号的含义$\bigcup_{k=1}^{n}$ 表示从第 1 个到第 n 个服务的全体集合,网关背后聚合了所有微服务。
- S_k 代表每个服务$S_k$ 是第 k 个微服务,比如订单服务、用户服务、支付服务,它们被网关统一管理。
核心功能拆解
门卫的岗亭里,摆着四样东西:一本厚重的门牌号对照表、一本访客登记薄、一根高峰限入栏杆,还有一本门卫日志本。别看这四样东西朴素,它们构成了门卫的核心工作流。API网关的核心功能,也正是这四件套。
路由分发(对照表):门卫根据访客报出的楼栋号,快速查找对照表,告诉他应该去哪栋楼。API网关的路由功能类似,根据请求的URL路径、域名或请求头,匹配预定义的路由规则,将请求转发到对应的服务实例。比如/api/orders开头的请求去订单服务,/api/users开头的去用户服务。路由规则本质上是“条件 + 目标”的映射表。身份鉴权(登记薄):每一位访客进入小区前,门卫都要查验证件、登记信息。API网关的鉴权插件会验证请求中携带的令牌(如JWT、OAuth2 Token),合法的请求放行,非法的直接拒绝。这相当于给每个请求发一张“临时通行证”。
限流熔断(栏杆):早晚高峰时,门卫会拉起栏杆控制人流——一次只进20人,防止太多人涌入小区造成拥堵。API网关的限流插件(如limit-count)通过令牌桶或漏桶算法,控制单位时间内的请求数。当某服务出现故障时,熔断器自动断开,不再将请求转发给故障服务,避免连锁反应。日志监控(日志本):门卫生成“今日访客表”,记录每位访客的进出时间。生产环境中,API网关记录每一个请求的完整调用链——谁在什么时间访问了哪个服务、耗时多少、响应码是什么。这些数据为监控告警系统提供了核心支撑。
门卫的岗亭四件套,就是网关的看家本领。有趣的是,Kong和APISIX这两个门卫,把这四件本事都练得炉火纯青,谁才是更好的门卫?我们下一节来对决。
- R_limit 表示当前允许的请求量$R_{\text{limit}}$ 是限流器计算出的“当前时刻还能放行多少请求”的判断依据。
- 桶容量 B$B$ 是令牌桶的最大容量,相当于小区内最多能同时容纳的人数,超过就拒绝进入。
- 时间补偿部分$(t - t_{\text{last}}) \times r$ 表示从上一次取令牌到现在,系统按速率 $r$ 往桶里补充的令牌数。
- 整体逻辑$\frac{B + \text{补给的令牌}}{1}$ 算出当前可用令牌数,请求消耗令牌,令牌不够就拒绝——这就是限流的“放行/拒绝”判定。
双雄对决
如今市面上的API网关多如牛毛,但站在C位的两位门卫,一位叫Kong,一位叫APISIX。Kong是老牌门卫,2015年就在Nginx的底盘上建起了岗亭,服务过无数大型小区(企业),经验丰富、插件众多。APISIX是后起之秀,2019年出道,一出场就采用了更先进的etcd配置中枢,性能直逼天花板。两位门卫各有拥趸,我们深入看看他们的底子。
Kong的架构:Kong基于Nginx构建,在Nginx之上封装了路由、鉴权、限流等能力。它使用PostgreSQL或Cassandra存储配置数据,节点无状态,可以轻松水平扩展。Kong的插件系统发展多年,插件市场极为丰富(超过100款),从JWT鉴权、ACL控制、gRPC转换到灰度发布,几乎应有尽有。APISIX的架构:APISIX同样基于Nginx/OpenResty,但最大的不同是使用etcd做配置存储与分发。etcd的watch机制使得配置变更可以秒级推送到所有网关节点,不需要手动 reload。APISIX的插件数量近年来猛增,2019年底还在追赶Kong,到2023年插件数已超过80款,且全部支持热加载。
在技术选型的天平上,Kong的优势是成熟稳定——它被全球数百家大型企业验证过,踩坑文档丰富,社区问答几乎全能搜到。APISIX的优势是性能与灵活性——单核QPS更高,配置热更新更迅捷,并且完全支持自定义插件的Lua编码。如果小区已经建了很多年、住户对安全有极致要求,Kong是稳妥之选;如果新小区追求极致效率、希望门规能动态调整,APISIX更能打。
Kong和APISIX的较量,很像两位门卫的PK:一位经验丰富、熟人遍天下,另一位更快更灵活、规则随改随用。对于新手团队,我更推荐从APISIX入手——它的配置热更新能力让“门规”调整像发微信一样即时送达,而这正是下一篇要讲的“插件机制”的基石。
- Q_i 是第 i 轮压测的吞吐量$Q_i$ 表示第 $i$ 轮压力测试测得的每秒请求处理数。
- 累加求和$\sum_{i=1}^{n}$ 表示把 $n$ 轮压测的吞吐量全部加起来。
- 取平均值$\frac{\sum Q_i}{n}$ 就是多轮压测的平均 QPS,用它来公平地比较两个网关的性能。
插件机制
门卫岗亭的墙上,有一排排挂挂钩,每个钩子上挂着一件工具:测温枪、安检棒、登记本、对讲机。今天小区要搞活动,物业就在钩子上加挂一个“活动指引牌”;明天有重要领导来访,就挂上“特别通行证核验器”。门卫不需要换人,只需更换或增减挂钩上的工具——这就是API网关的插件机制。
插件即积木:Kong和APISIX都是“管道式”架构,每个请求依次穿过一整条管道。插件就是管道上的阀门,每个阀门做一件独立的事。比如key-auth插件负责校验API密钥,limit-count插件负责计数限流,prometheus插件负责输出监控指标。开发者像搭积木一样组合这些插件,就能定制出符合业务需求的网关行为。常用插件巡礼:Kong的经典插件有jwt、acl、rate-limiting、cors等;APISIX同样提供jwt-auth、limit-req、limit-count、limit-conn、cors、proxy-rewrite等。有意思的是,APISIX还能通过插件实现“多环境发布”和“灰度路由”,比如让5%的流量进入新版本服务——这在Kong里需要额外配置,APISIX则云原生地支持。
自定义插件:当积木盒里没有你想要的形状时,就得自己削一块。Kong和APISIX都支持用Lua编写自定义插件。在APISIX中,你只需在apisix/plugins目录下新建一个Lua文件,实现rewrite和access等阶段的方法,然后通过Admin API将插件绑定到路由上即可。Kong的自定义插件流程类似,但需要重启Kong节点才能加载新插件(较新版本支持开发模式热加载)。编排顺序:插件不是乱挂的——每个插件都有priority属性,请求穿过管道时,系统按优先级从高到低依次执行。比如,鉴权插件优先级应高于日志插件,因为日志应该记录“验证通过”的请求,而不是把恶意攻击也记录下来。
门卫挂挂钩上的工具可以被随手替换,这正是网关“乐高式”的可扩展性。更妙的是,在APISIX里,更换挂钩上的工具不用让门卫下岗重训——门卫的“工作手册”(配置)可以在运行中动态修改,这就是下一节要讲的“动态配置与热更新”。
- P_pipe 表示插件管道$P_{\text{pipe}}$ 是请求依次经过的插件执行序列。
- 循环串联$\bigoplus_{i=1}^{m}$ 表示从第1个到第m个插件依次串联,形成一个管线。
- plugin_i 是第 i 个插件$\text{plugin}_i$ 表示管道中的第 $i$ 个插件节点,比如鉴权、限流、日志。
- 顺序即结果插件执行顺序影响最终行为——先鉴权再限流,和先限流再鉴权,效果截然不同。
动态配置热更新
以前,物业改一条门禁规则,要打印纸质通知、贴到岗亭、让门卫逐字阅读并背诵。这个过程慢且容易出错,如果门卫当天休息,新规则就形同虚设。今天,门卫岗亭里装了一块电子白板,物业在办公室点点鼠标,白板上的内容秒级更新——门卫抬头就能看到最新规则,不需要背、不需要等。这就是API网关的动态配置与热更新。
热更新原理:Kong和APISIX都将配置从“静态文件”升级为“配置中心”,但存储选型不同。Kong使用PostgreSQL存储路由、服务、插件等配置,管理API(Admin API)对配置的修改实时写入数据库。网关节点会监听数据库变更(通过DBless模式则可以做到类似APISIX的效果,但需额外配置)。APISIX则采用etcd作为唯一配置源——它天然支持watch机制,网关节点通过etcd的watch接口订阅配置变更,一旦有变化立即拉取最新配置,整个过程在毫秒级完成。
Kong的存储方案:Kong的传统模式是“数据库驱动”——所有配置API操作写入PostgreSQL,每个节点每秒钟轮询数据库获取变更。这种方案成熟可靠,但存在一定的延迟窗口(默认轮询间隔)。APISIX的存储方案:APISIX采用“etcd驱动”,配置写入etcd后,watch事件实时通知到每个节点。这意味着当一个路由规则被修改或新增时,所有节点在同一秒内感知到变化——这对需要频繁调整限流阈值或灰度比例的团队价值巨大。
门卫岗亭里的电子白板,让“门规”的修改从“贴通知等第二天生效”进化到“秒级实时同步”。这把动态能力,正是微服务架构中“灰度发布”和“动态限流”的基石。下一节我们上擂台,用数据看看Kong和APISIX的真实功夫。
- Δt_propagate 是配置传播时间$\Delta t_{\text{propagate}}$ 表示从“配置被修改”到“所有网关节点生效”之间的时间差。
- Kong 的轮询时间$T_{\text{poll}}$ 是数据库轮询间隔,Kong 默认每隔几秒检查一次数据库变更。
- APISIX 的 watch 时间$t_{\text{watch}} + t_{\text{network}}$ 是 etcd watch 事件的推送耗时加上网络传输耗时,通常只有几毫秒。
性能压测实战
光说不练假把式。门卫A说“我身经百战”,门卫B说“我反应神速”——到底谁更强,拉出来比一比。我们用业界标准的压测工具wrk,在相同的硬件虚拟机上,分别对Kong和APISIX发起高并发请求,记录QPS(每秒请求数)和延迟数据。
压测工具wrk:wrk是一个轻量级HTTP压测工具,用一行命令就能模拟成千上万的并发请求。命令格式如下:
这条命令的含义是:用4个线程,保持100个并发连接,持续压测30秒,统计总请求数和延迟分布。
实测数据对比:在一台2核4G的虚拟机上,不带任何插件的纯路由场景下,Kong的QPS约为4.2万,APISIX约为7.0万;P99延迟前者约1.8ms,后者约0.9ms。加上JWT鉴权和limit-count限流两个常用插件后,Kong降至3.1万QPS,APISIX仍有5.6万QPS——APISIX在同等条件下性能优势明显。需要说明的是,Kong运行在企业版(Kong Enterprise)时可以启用更多高性能特性,开源版存在一些性能开销。
延迟对比分析:延迟是用户体验的隐形杀手。APISIX的低延迟得益于它极致优化过的OpenResty架构和本地缓存机制。而Kong的数据库轮询机制在配置频繁变更时,会增加一定的CPU开销,间接影响请求处理延迟。在生产环境中,我们通常关注P99(99%请求的耗时上限)——APISIX的P99延迟在压测中始终低于2ms,Kong则在2~3ms之间波动。
擂台赛数据揭晓:APISIX的功夫确实更俊(性能更高),Kong的实战经验更足(生态更成熟)。但性能不是选型唯一的因素——真正的高手选择门卫,看的不只是块头,还有他适不适合你小区的具体情况。这就是我们的最终章:选型决策指南。
- P99 的概念$T_{\text{p99}}$ 表示 99% 的请求耗时都在这个值以内,是衡量系统稳定性的核心指标。
- 运行符 <$\approx 0.9\text{ms} < \approx 1.8\text{ms}$ 表示 APISIX 的 P99 耗时约为 Kong 的一半。
- 实际意义如果 P99 都低于 2ms,说明即使在高负载下,绝大多数用户请求依然响应极快。
wrk -t4 -c100 -d30s http://localhost:8000/api/orders选型决策指南
小区物业在选门卫时,不会只挑“块头最大”的那位,而是要综合考虑小区规模、住户习惯、未来计划、预算成本。API网关的选型也一样,需要从四个维度做权衡。
技术栈匹配:如果团队的技术栈深度绑定Nginx生态、已有OpenResty/Lua的开发经验,APISIX的定制化门槛更低;如果团队更熟悉传统关系型数据库(如PostgreSQL)运维,Kong的传统架构可能更亲切。社区支持:Kong背靠Kong Inc.公司,商业化程度高,企业级文档完善,社区论坛响应快;APISIX由Apache基金会孵化,社区活跃度近年来迅速飙升,尤其在中国开发者和云原生社区中热度很高。遇到问题时,Kong能找到更多“历史踩坑帖”,APISIX的社区也更愿意快速反馈和修复。
性能需求:如果你的业务对延迟敏感(比如交易系统、实时通话),APISIX的低延迟优势值得认真考虑;如果性能需求一般但更看重稳定性,Kong久经沙场的老牌品质能带来更大的安全感。运维成本:Kong需要额外运维PostgreSQL,APISIX需要运维etcd——两者都引入了外部依赖,但etcd的运维更自动化(可独立部署、自动选主),PostgreSQL在某些企业里已有专门的DBA团队,运维反而更轻松。此外,APISIX的控制面(Control Plane)和数据面(Data Plane)可以分离部署,对大规模集群更友好。
选门卫的终极智慧,不是选“最好的”,而是选“最合适的”。Kong和APISIX都是优秀的API网关,它们之间的选择,本质上是团队技术偏好、性能需求和运维能力的综合权衡。对于绝大多数中小团队,我的建议是:追求极简运维与高QPS,选APISIX;追求企业级稳定与PostgreSQL生态,选Kong。
- Score 是综合评分$\text{Score}_{\text{gateway}}$ 表示对某个网关(Kong 或 APISIX)的总体评价。
- 权重 w_i$w_1$ 到 $w_4$ 是各维度的权重系数,团队可以根据业务需求自行设定。
- 四个维度$C_{\text{tech}}$ 是技术栈契合度,$C_{\text{community}}$ 是社区支持,$C_{\text{perf}}$ 是性能得分,$C_{\text{ops}}$ 是运维便利性。
- 加权求和的含义将各维度得分乘以其权重后相加,得到一个综合评分,谁分高选谁。
AI 应用场景
智能限流:AI助手自动调节门卫栏杆
阶段:数据接入与特征工程
解决的问题:传统限流策略需要人工设置固定阈值,大促时流量飙升导致服务雪崩,闲时阈值过高又浪费资源。通过AI预测流量趋势,动态调整网关限流阈值,实现“门卫栏杆自动升降”。结合APISIX的limit-count插件的动态配置能力,AI引擎预测到未来5分钟QPS将激增时,自动调低限流阈值防止后端被打垮。
具体案例:某电商平台在双11大促期间,使用AI模型基于历史流量数据预测未来请求量。预测到高流量时段后,AI引擎通过APISIX Admin API自动更新限流插件配置——从默认的10000 QPS逐步下调至8000,并在流量回落后自动恢复。整个过程无需人工干预,网关的“门卫”变成了一个会读空气的智能保安。
AI网关插件:用LLM做请求语义路由
阶段:模型训练与推理
解决的问题:传统路由只依赖URL路径精确匹配,“老门卫只认门牌号”。当一个请求表达不清晰或需要语义理解时(比如“帮我查一下上周的订单”),传统网关无法识别该路由到订单服务还是用户服务。利用AI插件接入LLM,网关可以解析请求的自然语言意图,再动态重写路由目标。
具体案例:某智能客服系统在网关层部署了LLM路由插件:请求先经过AI语义分析,识别出意图为“查订单”,然后网关将请求重写为/api/orders路由前缀,转发到订单服务。用户无需记忆API路径,只说大白话即可直达正确服务——门卫从“认门牌”进化到“听懂话”。
Python 演示
import timeimport threadingfrom collections import defaultdict class TokenBucket: """令牌桶限流器:门卫的'高峰限入栏杆'""" def __init__(self, capacity, rate): self.capacity = capacity self.rate = rate self.tokens = capacity self.last_refill = time.time() self.lock = threading.Lock() def allow(self): with self.lock: now = time.time() self.tokens = min( self.capacity, self.tokens + (now - self.last_refill) * self.rate ) self.last_refill = now if self.tokens >= 1: self.tokens -= 1 return True return False class APIGateway: """API网关模拟器:统一小区大门的门卫""" def __init__(self, capacity=10, rate=5): self.routes = {} self.api_keys = {} self.limiter = TokenBucket(capacity, rate) self.logs = [] def register_route(self, path, target): """注册路由:门卫的'门牌号对照表'""" self.routes[path] = target def register_api_key(self, key, owner): """注册API密钥:门卫的'访客登记薄'""" self.api_keys[key] = owner def check_auth(self, headers): """鉴权:查验访客证件""" key = headers.get("X-API-Key") if not key or key not in self.api_keys: return False, "401 Unauthorized: missing or invalid API key" return True, self.api_keys[key] def forward(self, path): """路由转发:按门牌号送到对应楼栋""" if path in self.routes: return self.routes[path] return "404 Not Found: no route for " + path def handle(self, path, headers): """主入口:门卫的完整工作流""" ok, result = self.check_auth(headers) if not ok: return result owner = result if not self.limiter.allow(): return "429 Too Many Requests" target = self.forward(path) self.logs.append((path, owner, target)) return "200 OK -> " + target if __name__ == "__main__": gw = APIGateway(capacity=5, rate=2) gw.register_route("/api/orders", "order-service") gw.register_route("/api/users", "user-service") gw.register_api_key("secret-123", "alice") headers = {"X-API-Key": "secret-123"} for i in range(8): print(gw.handle("/api/orders", headers)) print("gateway logs:", gw.logs)
class TokenBucket令牌桶限流器,对应门卫的“高峰限入栏杆”,控制请求进入速率。self.tokens = min(self.capacity, self.tokens + ...)按时间流逝补充令牌,但不超过桶容量。check_auth查验请求头中的X-API-Key,对应门卫检查访客证件。self.limiter.allow()限流判定,返回False说明每秒请求超限,拒绝放行。register_route(path, target)设置路由映射:/api/orders去订单服务,对应门卫的记忆力。gw.handle("/api/orders", headers)模拟一个带密钥的请求走完网关全流程,8次请求中后3次因限流被拒绝。
常见误区
误区我用了Nginx做反向代理,负载均衡和URL重写都有了,为什么还要Apache APISIX或Kong?网关不就是Nginx换个马甲吗?
正解反向代理是网关的“基本功”,但网关的核心价值在治理能力——动态路由、鉴权、限流、熔断、灰度发布、可观测性。Nginx的配置是静态文件,改配置需要reload;而APISIX通过etcd热更新配置,还能以插件形式扩展能力。把网关比作门卫,Nginx就像一扇普通的门——能开关,但不会判断谁可以进、不能识别危险人物、不会记录访客日志。API网关是“智能门卫”,而不是一扇“高级的门”。
为何常见:很多后端工程师大量使用Nginx,熟悉它的配置语法和性能优势。看到网关底层也是Nginx/OpenResty,就想当然地认为“网关=Nginx”,忽略了网关在Nginx之上构建的管理平面、Admin API和插件体系。
误区网关作为统一入口,所有请求都先到它再转发到后端,多一跳网络,性能肯定比直连后端差很多吧?那还不如不用网关。
正解网关的转发是在内网进行的,延迟极低(毫秒级),而它带来的收益——统一鉴权、限流、协议转换、监控——远超这一点点开销。现代网络环境中,局域网内一跳的耗时通常在0.1~0.5ms,相比公网几十毫秒的延迟完全可以忽略。更重要的是,没有网关时,每个服务都要自己实现鉴权限流,业务代码被横切逻辑污染,维护成本更高。门卫确实让你进小区多了一道手续,但他挡掉的危险和带来的秩序,远比那几秒的等待更有价值。
为何常见:人们本能地害怕“多一层”会产生额外开销,忽略了架构设计是“权衡取舍”的整体游戏,而不是单点优化。
误区限流嘛,阈值设小一点,后端服务肯定不会被压垮,反正平时QPS也不高,设小一点也没关系。
正解限流阈值过小,会误伤正常用户。假设某核心接口平均QPS为800,你设置了500的限流阈值,高峰时300个正常请求会被网关拒绝,用户直接看到429错误。正确的做法是基于容量评估设定阈值——比如压测发现服务最大支撑2000 QPS,留30%余量,设置1400 QPS的限流值。同时配合排队或降级策略,而不是“一刀切”拒绝。就像小区高峰期的限入栏杆,如果一次只放5个人进,全小区几百人都会堵在门口——栏杆要配合“分批放行”的策略,而不是简单地把门关小。
为何常见:对限流的理解停留在“保护后端”的单一角度,忽略了限流的核心目标其实是“保护后端的同时,最大化有效请求的通过率”。
误区APISIX用etcd做配置存储,热更新速度快,Kong用PostgreSQL还要轮询,是不是APISIX全面碾压Kong?那就直接选APISIX吧。
正解技术选型从来不是单一维度的比拼。Kong的PostgreSQL方案在某些场景反而是优势——对于已有成熟的数据库运维体系的企业,PostgreSQL的备份、恢复、审计流程都现成可用;etcd虽然watch推送快,但也引入了新的运维组件,需要额外的故障排查经验。Kong的企业版还提供Kong Manager图形化管理界面和RBAC权限控制,这在大型企业中是重要的加分项。门卫A跑得快但不会说外语,门卫B会多国语言但动作慢半拍——关键看小区住户需要什么。
为何常见:技术社区常常把“新技术=更好的技术”划等号,忽略了架构选型需要结合团队技术储备、运维能力和业务需求综合判断。
误区有了API网关做路由,服务间的互相调用也可以走网关,服务注册中心(如Nacos、Consul)是不是就没用了?
正解API网关解决的是“外部请求如何进入后端服务”的问题,而服务注册中心解决的是“后端服务之间如何互相发现”的问题。两者关注不同的流量方向。服务A调用服务B时,通常走注册中心做服务发现,而不是绕道网关——否则请求多一跳、延迟增加,也让网关成为单点瓶颈。门卫管的是“外部访客如何找到楼栋”,但楼栋之间的快递转运(服务间调用)走的是小区内部物流通道(注册中心直连),不需要经过大门口。
为何常见:看到网关有服务发现功能(从注册中心拉取服务列表),就以为它可以替代注册中心。实际上网关是注册中心的“消费者”,两者是协作关系而非替代关系。
面试题
Q1. API网关最核心的职责是什么?
- A.统一接收所有外部请求并转发到后端微服务← 正确答案
- B.代替数据库执行复杂查询
- C.直接处理业务逻辑
- D.替代消息队列做异步通信
答案:A。API网关是微服务的统一入口,核心职责是接收外部请求,经过鉴权、限流、路由等处理后转发给后端服务。它不做业务逻辑(C错),不替代数据库(B错),也不处理异步消息(D错)。就像门卫负责指引访客,不代替住户接待客人。
Q2. 网关的鉴权功能相当于门卫的哪项工作?
- A.查看门牌号对照表
- B.查验访客身份证件← 正确答案
- C.控制高峰人流
- D.记录每日访客日志
答案:B。鉴权是验证请求是否携带有效令牌(如JWT、API Key),决定“你是谁、可不可以进”,对应门卫查验证件。路由是查对照表(A错),限流是控制人流(C错),监控是记日志(D错)。
Q3. Kong和APISIX在配置存储上的核心区别是什么?
- A.Kong用etcd,APISIX用PostgreSQL
- B.Kong用PostgreSQL,APISIX用etcd← 正确答案
- C.Kong用Redis,APISIX用Memcached
- D.两者都使用ZooKeeper
答案:B。Kong使用PostgreSQL或Cassandra存储配置,节点通过轮询数据库感知变更;APISIX使用etcd作为配置中心,通过watch机制实现配置秒级推送到所有节点。B正确,A说反了,C和D都是编造的存储方案。
Q4. APISIX的限流插件使用什么算法实现流量控制?
- A.FIFO队列算法
- B.令牌桶和计数限流算法← 正确答案
- C.冒泡排序算法
- D.决策树分类算法
答案:B。APISIX提供了基于令牌桶的limit-req插件和基于固定计数的limit-count插件,核心思想是控制请求速率和总量。FIFO是队列概念(A错),冒泡排序是排序算法(C错),决策树是机器学习算法(D错)。就像门卫的栏杆,既要控制每秒放行几个人(速率),也要限制单位时间总人数(计数)。
Q5. 以下哪些是API网关的典型能力?
- A.统一身份认证与授权← 正确答案
- B.流量限制与熔断降级← 正确答案
- C.请求日志与监控指标← 正确答案
- D.编译执行后端业务代码
答案:ABC。鉴权(A)、限流熔断(B)、日志监控(C)都是网关的核心治理能力。网关不执行业务代码(D错),它只做请求的“交通管理”,不代替服务处理业务。
Q6. 关于插件机制,下列哪种说法是正确的?
- A.插件一旦绑定路由,只能通过重启网关才能生效
- B.插件按优先级顺序执行,形成一条处理管道← 正确答案
- C.插件的执行顺序是随机的
- D.插件只能用于鉴权,不能用于流量控制
答案:B。Kong和APISIX的插件都有priority属性,请求按优先级从高到低依次经过各插件(B正确)。APISIX支持插件热加载,不一定要重启(A错误)。插件执行顺序按优先级排列而非随机(C错误)。插件种类覆盖鉴权、限流、日志、转换等多种能力(D错误)。
Q7. 某业务高峰期QPS约2000,压测显示后端服务最大可承受2500 QPS。为了保证服务不被打垮同时最大化有效请求通过,合理的限流阈值应设为多少?
- A.设置为2000(与高峰持平)
- B.设置为1500(保守防御)
- C.设置为1750(留30%余量)← 正确答案
- D.设置为3000(超过压测上限)
答案:C。限流阈值应低于服务极限并留一定余量。最大承受2500 QPS,留30%余量即1750(C正确)。与高峰持平(A)在流量波动时容易击穿;设置过小(B)会误伤正常请求;超过极限(D)完全失去保护作用。这是门卫栏杆的智慧:一次放多少人,才能既保护小区又不让住户久等。
Q8. 关于APISIX的etcd配置热更新机制,以下说法正确的有哪些?
- A.配置写入etcd后,所有节点通过watch机制几乎同时感知变更← 正确答案
- B.与Kong的数据库轮询方案相比,APISIX配置传播延迟更低← 正确答案
- C.配置热更新不需要重启网关进程← 正确答案
- D.配置修改后必须手动执行nginx -s reload才能生效
答案:ABC。etcd的watch机制让配置变更毫秒级推送到所有节点(A正确),比Kong的轮询方式延迟更低(B正确)。APISIX支持动态加载配置,无需重启进程(C正确)。APISIX不需要手动reload Nginx(D错误),这正是它区别于传统Nginx配置管理的最大亮点。
Q9. 在Kong和APISIX中,自定义插件通常使用什么编程语言编写?
- A.Java
- B.Lua← 正确答案
- C.Python
- D.Ruby
答案:B。Kong和APISIX都基于OpenResty(Nginx+LuaJIT),自定义插件使用Lua编写。还有一种趋势是使用Rust、Go等语言通过WASM编写插件,但主语言仍是Lua。Java、Python、Ruby无法直接在Nginx生态中运行。
Q10. 关于网关选型,以下哪些判断是合理的?
- A.对延迟敏感的交易系统,优先考虑APISIX的低延迟优势← 正确答案
- B.团队已有成熟的PostgreSQL运维体系,Kong可能更易落地← 正确答案
- C.追求极致性能必须选APISIX,选Kong一定后悔
- D.金丝雀发布和灰度路由功能,APISIX的云原生支持更友好← 正确答案
答案:ABD。延迟敏感场景选低延迟的APISIX合理(A正确);已有的PostgreSQL运维经验让Kong的运维更顺畅(B正确);选型是综合权衡,“必须选”和“一定后悔”过于绝对化(C错误);APISIX原生支持流量灰度划分,适合金丝雀发布场景(D正确)。选门卫要综合考虑,不能只看单一技能点。