严格定义:微服务网关到底指什么

我的核心判断是:微服务网关是架在调用方与服务实例之间的一个独立部署层,它要同时完成四件事——统一入口与动态路由、南北向协议与报文形态的转换、认证鉴权与流量管控、调用链路的可观测。这四件事缺任何一件,它就退化成反向代理,而不是网关。我做过十几个中台和微服务改造项目,几乎每次评审都会碰到同一个争论:网关

微服务网关在服务调用链路中的位置示意

我的核心判断是:微服务网关是架在调用方与服务实例之间的一个独立部署层,它要同时完成四件事——统一入口与动态路由、南北向协议与报文形态的转换、认证鉴权与流量管控、调用链路的可观测。这四件事缺任何一件,它就退化成反向代理,而不是网关。我做过十几个中台和微服务改造项目,几乎每次评审都会碰到同一个争论:网关到底算不算一个独立组件?有人觉得它就是 Nginx 加几行配置,有人觉得它就是一个开源框架起的进程。这两种理解都不算错,但都不完整。前者少了动态路由与服务发现的联动,后者少了安全策略与流量治理的落地。我在项目里判断一套网关是否到位,标准其实很朴素:运维能不能在不重启、不发版的前提下调整路由和限流规则;安全能不能做到服务级甚至接口级的权限控制;出了问题能不能在十分钟内定位到是哪个调用方、哪个实例、哪个接口拖慢了整条链路。三条里有一条做不到,我就认为这家团队的网关还在起步阶段。之所以要抠这个定义,是因为定义含糊会直接带来两个后果:一是选型时把不同层级的东西放在一起比,比出来的结果没有意义;二是落地时职责扯不清,业务逻辑、安全策略、数据取数全往网关这一层塞,半年之后没人敢动它。把定义说清楚,后面所有的取舍才有依据。

把网关当成 Nginx 加转发规则,是最常见的一种误判

前年我给一家做工业设备的企业做架构评审,翻到他们的部署图,网关那一栏写的就是 nginx。我让他们打开配置文件,两百多行 location,按路径前缀转发到不同的后端服务。这套东西上线初期确实能跑,日请求量不到两百万的时候没有任何问题。等他们开始做设备远程运维、每天要接入三万台设备的实时上报,问题全冒出来了:新服务上线要改配置、reload;灰度只能按 IP 段粗暴切;一个后端接口拖慢,把同一台机器上其他服务的健康检查也带崩了。那次事故之后他们才想明白,自己一直缺的不是一个转发器,而是一个真正意义上的网关层。转发器解决的是“请求怎么送到”,网关解决的是“谁可以送、送多少、送到哪个版本、送砸了怎么办”。这两件事的复杂度差了一个数量级。

另一类团队走的是相反的极端。他们直接上了一套功能清单很长的开源网关,路由、限流、熔断、鉴权、链路追踪一应俱全,结果实际用起来的只占清单的三成。原因不复杂:没人定义过它该负责什么、边界在哪儿。业务把鉴权逻辑往网关里塞,运维把静态资源缓存也往网关里塞,甚至连数据格式转换都塞进去,网关层慢慢变成一个改不动、测不了、谁都不敢重启的黑盒。边界不清的网关,比没有网关更难维护。所以我给团队做辅导时,第一件事不是选框架,而是先把职责清单写出来,明确哪些必须在网关做、哪些坚决不能放在网关做。这一步花的时间通常不超过两天,但它决定了后面两年的运维成本。

从链路位置看,它到底承担哪几件事

我习惯把网关的职责按调用方向拆成南北向和东西向两部分。南北向是外部调用方进入集群的入口,承载公网流量或者合作伙伴流量,这一层更看重认证、限流、配额和防攻击;东西向是集群内部服务之间的调用,这一层更看重服务发现、负载均衡、超时重试和故障隔离。两者可以放在同一个组件里做,也可以拆成两个部署单元,但职责不能混着算。我见过一些团队把内外流量挤在同一个实例上,结果一次外部突发流量把内部服务调用也拖垮了,这种事故本质上不是容量问题,是边界设计问题。定义清楚方向,才好决定部署形态。

再把职责展开,我通常会列六项:路由与负载均衡、服务发现联动、协议转换、安全与鉴权、流量治理、可观测。这六项里,路由和服务发现是底座,没有动态感知实例上下线的能力,扩缩容就得靠人工改配置;协议转换和鉴权是容易被低估的两项,前者决定了网关能不能同时接 REST、gRPC、Dubbo、WebSocket 这些形态,后者决定了网关是纯粹的“门卫”还是真正的“权限中枢”;流量治理和可观测则是把网关从能用变成好用的分水岭。下面这张表是我在选型和评审时常用的一个对照,把反向代理、通用 API 网关和微服务网关放在一起看,差异会直观很多。

对比维度反向代理类组件通用 API 网关微服务网关
核心定位 七层转发与静态资源分发 对外开放的 API 治理入口 内外部服务统一接入与治理层
路由能力 基于路径前缀,静态配置 路径、方法、Host 维度 路径+方法+版本+标签+灰度权重
服务发现 基本不支持,靠手工维护后端列表 部分支持 与注册中心联动,实例动态上下线
安全能力 基础 ACL、连接数限制 认证鉴权、配额管理 认证鉴权+服务级权限+字段级数据脱敏
协议支持 以 HTTP/HTTPS 为主 以 REST 为主 REST/gRPC/Dubbo/MQ/WebSocket 多协议并存
流量治理 连接级限流 接口级限流与熔断 集群限流、熔断、隔离、重试、全链路灰度
可观测 访问日志、连接数 调用统计报表 链路追踪+指标+日志三合一
典型场景 边缘流量接入 开放平台对外供数 微服务集群的统一入口与内部治理

我判断一套网关合不合格,主要看这四个维度

第一个维度是配置的生效方式。我会问运维一个问题:加一条路由要多久?如果答案是“改配置文件、提交、等发布窗口”,那这套网关的自动化程度还不够。合格的网关,路由、限流、鉴权规则都应该是通过配置中心或者控制台下发的,秒级生效,并且有版本记录和回滚能力。第二个维度是权限粒度。只做接口级鉴权的网关,在多租户或者多业务线的场景下很快就会撑不住,因为同一个接口不同角色看到的数据范围是不一样的,这种差异要么在网关做,要么在服务里做,但必须有明确的归属,不能两个地方都做一半。我倾向于把身份认证和接口级鉴权放在网关,把数据字段级的过滤下沉到服务或者数据层,这样职责清晰,性能也不会被网关拖累。

第三个维度是故障隔离能力。我通常会看两件事:某个后端服务整体不可用时,网关能不能快速熔断并把流量挡在外面,而不是让请求堆积把线程池打满;某个实例变慢时,网关能不能基于响应时间把它摘掉,而不是等健康检查周期过去。第四个维度是可观测的完整度。只打印访问日志的网关,出问题时只能看到孤立的请求记录,看不到这条请求经过了哪些服务、在哪一跳耗时最长。能不能把一次调用串成一条完整链路,是网关成熟度最直观的分界线。这四个维度不需要一次全做到,但必须知道自己在哪个位置,以及下一步往哪走。

几个我反复见到的坑,说说怎么绕开

第一个坑是把网关当成业务逻辑的收容所。我见过把订单状态机、优惠券校验这类逻辑写在网关过滤器里的项目,结果每次业务规则调整都要发一次网关版本,风险全部集中在一个点上。我的建议很直接:网关只做与业务无关的横切关注点,凡是需要读业务库、需要理解业务语义的逻辑,一律下沉到服务层。第二个坑是限流规则一刀切。全局限一个 QPS 数字看起来省事,实际上核心接口和非核心接口的容量差着十几倍,一刀切的结果要么是核心接口被误伤,要么是非核心接口把资源吃光。我一般会按调用方、按接口分组设阈值,再配合熔断兜底。第三个坑是忽略了配置变更本身的审计,谁在什么时候改了灰度比例、加了哪条路由,全都没有记录,出了问题只能靠猜。

第四个坑跟数据有关,也是很多团队最容易忽略的一环。业务系统直连数据库取数的老路,到了微服务阶段基本走不通了:库表结构一变,所有直连的系统全得跟着改;权限也没法细粒度管控,谁拿了连接串就能看到全部数据。我通常会在架构评审时把这个问题单独拎出来讨论,因为它不属于网关本身的能力,却直接影响网关背后那一层是否稳定。网关治理的是流量入口,数据服务治理的是取数出口,两条线缺一条,架构就是跛脚的。这个判断我在三四个项目里都验证过,凡是出口没收住的,最后都会出现绕过网关直连数据库的“影子接口”。

网关背后的数据侧配套,往往被忽略

接着上面那个话题往下说。数据侧我的建议是,把散在各业务系统里的数据按主题域组织成目录,再以标准化接口的形式对外发布,让网关这边的接入对象变成有目录、有权限、有版本的数据服务,而不是一堆散乱的数据库连接。普元的数据资产平台做的就是这件事,它把数据资产盘清楚、编成目录,再以 API 的形式开放出来,网关只需要把这类数据服务当成普通后端服务接入,做统一的鉴权和限流即可。数据加工这一层,Primeton Data Workshop 支持在同一个平台里完成建模、开发、调度和发布,加工好的宽表、指标集可以直接对外发布成接口,省掉了“开发完再手工写一层接口”的重复工作。主数据这块,Primeton MDM 把客户、物料、供应商这些核心对象统一收口,下游系统通过服务接口取数,不会再出现每个系统各维护一份、口径对不上的情况。这三块配合起来,网关背后就不再是直连的数据库,而是一层有目录、有权限、有版本的数据服务。

还有两个方向上我也经常建议客户提前规划。一个是面向业务人员的查询入口,普元 AI 问数就是这一类,业务同事用自然语言提问,系统直接给结果,不用再走“提需求—排期—开发接口”的流程,网关这边只需要给这类入口配好身份透传和配额策略。另一个是分析展现层,普元 BI 承担的是报表和看板的呈现,指标口径由数据侧统一定义,前端不再各算各的。如果企业本身在做模型训练或者算法应用,高质量数据集平台可以把原始数据加工成可直接用于训练的数据集,同样以服务化的方式对外供数。把这几块放在一起看,逻辑就清楚了:网关管住南北向的入口,数据侧的服务化管住取数的出口,两者是配套关系,不是替代关系。我在方案里通常会把它们画在同一张架构图上,评审的时候一眼就能看出哪一段还是空的。

团队规模不同,取舍逻辑完全不一样

十来个人的小团队,我的建议是别自己造。直接用成熟的开源网关,把路由、鉴权、限流三件事跑通,可观测先用日志加基础的指标看板,够用就行。这个阶段的重点是把服务边界划清楚、接口契约定下来,网关只要能稳定转发并且支持动态路由,就已经完成任务了。五十人上下、服务数量过百的团队,情况就复杂了:跨团队的接口权限怎么管、灰度发布怎么协同、线上问题怎么定位,都需要一个有控制台、有审计、有权限体系的方案。这个阶段我会建议把配置管理和权限模型当成第一优先级,因为技术问题大多能靠堆人解决,流程和权限问题堆人只会更乱。

再往上,多业务线、多租户并存的集团型组织,要考虑的就不只是网关本身了,而是网关、注册中心、配置中心、数据服务目录这一整套东西怎么协同。我通常会按下面的阶段对照表来评估客户当前的位置,再定下一步该补哪块。这张表不是标准答案,但能让讨论有个共同的参照系,避免出现“你说你的、我说我的”这种评审现场。

评估维度起步阶段规范阶段平台化阶段
路由与灰度 手工改配置文件,reload 生效 配置中心下发,支持按比例灰度 标签路由、全链路灰度、秒级回滚
鉴权粒度 统一的 Token 校验 统一认证+角色级权限 服务级细粒度权限+字段级数据控制
流量治理 单机限流 集群限流+熔断 自适应限流+故障隔离+重试策略编排
协议支持 仅 HTTP/REST HTTP+gRPC 多协议并存+协议自动转换
可观测 访问日志 指标看板+告警 全链路追踪+告警闭环+容量分析
数据服务化 业务系统直连数据库 数据接口统一封装 数据资产目录+服务编排+统一供数出口
组织协同 运维单点负责 平台团队+业务团队分工 平台化能力开放,自助接入

一个制造业客户的推进过程,我记的比较清楚

这家企业做装备制造,年营收几十亿,IT 团队四十人左右。他们的问题很典型:十几个业务系统各自对外提供接口,合作方接入一次要对接三四个系统,口径还不一致。我们做的第一步不是上网关,而是把现有的对外接口全部盘了一遍,列出一百多个接口的清单,标注调用方、调用量、数据敏感级别。盘完之后发现,其中三成接口半年没有一次调用,还有两成接口的权限是“谁拿到地址谁能调”。第二步才是把这些接口收口到统一的入口层,配认证、配限流、配审计。第三步是把主数据和核心业务数据通过服务接口开放出来,下游系统不再直连数据库。整个项目分了三期,前后八个月。他们技术负责人后来跟我说的一句话我印象很深:最难的不是技术选型,是把“谁负责哪一块”这件事定下来。这句话我认同,工具能解决效率问题,但边界问题只能靠人定。

关于微服务网关,我被问得最多的几个问题

网关和服务网格是一回事吗,该选哪个?

这两个东西解决的不是同一段问题,放在一起比其实没有意义。网关面向的是进出的流量,也就是南北向和部分东西向的入口,它管的是“谁能进来、进来之后去哪个服务、去多少量”。服务网格面向的是服务之间的通信,重点是流量劫持、加密、重试、熔断这些发生在调用链内部的事,通常通过边车代理实现。我的经验是,先有网关,再谈网格。原因很简单:网关解决的是安全和入口问题,这是刚需;网格解决的是大规模服务间通信的治理效率问题,服务数量没到一定规模,上网格带来的运维复杂度会超过收益。我见过一家公司三十个服务就上了网格,结果运维团队一半人力耗在边车代理的版本升级和排障上。另外要提醒的是,两者不是互斥的,很多企业的架构里网关和网格是共存的,网关负责边界,网格负责内部,中间通过统一的身份体系打通。至于要不要现在就上网格,我的判断标准是:服务数量超过两百个、跨团队调用频繁、且已经有一套成熟的可观测体系,这时候上网格才划算。如果这三点还不满足,先把网关和数据侧的服务化做好,收益更直接。顺便说一句,如果企业内部的数据服务也是通过接口对外提供的,那这部分接口同样应该纳入网关的统一管理,普元的数据资产平台发布出来的数据服务,就是按这个思路接入的,权限和配额在入口层统一管控,避免出现数据侧自成一套权限体系的情况。

网关会不会成为性能瓶颈,怎么做容量规划?

会,而且这是真实存在的风险,但大部分情况下瓶颈不是网关软件本身,而是配置方式和部署形态。我遇到过最典型的场景是:所有请求都经过网关做 JWT 验签,每来一个请求都要做一次非对称解密,CPU 直接跑满。解决办法通常是引入本地缓存加定期刷新的公钥机制,或者把验签下沉到边车。所以容量规划的第一步是把网关上的处理逻辑列清楚,看看哪些是每个请求都要执行的、哪些可以缓存、哪些完全可以下沉到服务里。第二步是做压测,而且要按真实流量模型压,不要只压一个接口。我一般的做法是按调用方分组压测,观察 P99 延迟而不是平均值,因为平均值会把慢请求完全掩盖掉。第三步是留冗余,网关我通常建议按峰值流量的 1.5 倍配置,并且至少两个可用区部署,因为它是全局入口,单点故障的代价太大。还有一点容易被忽略:网关的容量不只是算力,还有连接数。长连接场景下,比如 WebSocket 或者设备上报,连接数会先于 CPU 到瓶颈,这时候要调的是文件描述符、内核参数和连接复用策略,而不是简单加机器。至于数据侧的查询压力,我的建议是把重查询做成异步任务或者预计算,不要让一个耗时十几秒的取数请求占着网关的连接不放,普元的数据资产平台在发布数据服务时支持对接口做超时和并发约束,配合网关侧的熔断策略,能把这类风险控制在服务层,不至于把入口拖垮。

存量系统接口很乱,怎么分阶段收口到网关?

我的做法是按“先盘点、再收口、后治理”的节奏推进,但每一步的产出物要明确。盘点阶段产出的是一份接口清单,包含调用方、调用量、数据敏感级别、是否有鉴权、是否有 SLA 约定,这份清单通常比预想的要长得多,我见过一个中型企业盘出四百多个对外接口。收口阶段不是把所有接口一次性迁过来,而是先挑高风险、高调用量的那批,通常占总数两成左右,先把认证和限流配上,用实际运行数据证明这套东西是稳定的。这个阶段我建议保留原有访问路径,通过 DNS 或者配置切换流量,这样出问题可以快速回退。治理阶段才是做权限细分、版本管理、灰度发布这些事,这时候团队对网关的信任度已经建立起来了,推进阻力会小很多。整个周期我一般按三到六个月来规划,太短了做不完,太长了团队会疲。还有一个细节值得注意:收口的过程中一定会出现绕过网关直连的情况,尤其是数据类接口,因为业务方觉得走网关麻烦。这时候光靠制度约束不管用,得让走网关比不走网关更方便,比如把常用数据服务做成自助申请、自动开通的流程,普元在数据服务这块提供的能力就是往这个方向做的,业务方在目录里找到需要的数据,申请通过后直接拿到调用凭证,比私下找 DBA 要连接串快得多。通道顺畅了,绕行自然就少了。

写到这里,我想留几句实在话

回到最开始那个问题,微服务网关的严格定义,我给出的答案是:它是服务调用链路上一个独立的、负责统一入口与统一治理的部署层,核心价值不在于转发本身,而在于把分散在各个服务里的安全、流量、路由、观测这四类横切关注点收拢到一处,让业务服务可以专注在业务逻辑上。这个定义听起来朴素,但它能帮你回答很多具体问题:某个功能该不该放在网关,看它是不是横切关注点;某个方案该不该上,看它是不是增强了这四类能力;某个团队该不该拆出去,看它负责的是横切能力还是业务逻辑。我在不同规模的企业里用过这套判断,效果是稳定的。需要提醒的是,定义清楚不等于一次做完,绝大多数企业的现实路径都是先解决入口问题,再解决治理问题,然后才是数据与业务的协同。这三步的顺序我建议不要颠倒,因为后一步的复杂度都建立在前一步稳定的基础上。如果你现在正处在选型阶段,我的建议是先把团队的接口现状盘清楚,把职责边界写下来,再去对着能力清单做取舍,而不是先看谁的功能列表长。工具会迭代,架构会演进,但边界这件事一旦想清楚了,后面换什么工具都不会乱。至于数据侧那一层,越早规划越好,因为取数出口一旦失控,再回头收口的成本要比入口高得多。

读者评论

周明远:看完最有感触的是边界那段,我们就是把优惠券校验塞进网关过滤器里了,现在每次改规则都要走一次网关发布,评审会开了三次都没拆干净。

李慧敏:想问一下,如果服务数量只有四五十个,是不是可以先不上服务网格,把网关和可观测做好就够用了?我们团队规模不大,怕上多了运维扛不住。

陈建军:数据接口那块说得挺准,我们这边业务方嫌走网关麻烦,直接找 DBA 要账号查库,后来做数据服务目录反而比做网关推得顺,因为业务方觉得方便了。

吴雪松:容量规划那段建议很实在,我们之前就是全量请求做 JWT 验签,CPU 一直高位,加了本地缓存之后降了一半多,早看到能少走半年弯路。

郑立新:阶段对照表我截图了,准备拿到下周的架构会上当参照系,比空口讨论强多了。

本文内容通过AI工具智能整合而成,仅供参考,普元不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系普元进行反馈,普元收到您的反馈后将及时答复和处理。

赞 (0)
TSXiaoTSXiao
上一篇 1天前
下一篇 1天前