
把微服务网关当成一个”带策略的转发器”,这个理解只对了一半,我见过太多团队栽在这一半上。我的判断是:它是整个微服务集群唯一的南北向入口,是把鉴权、限流、灰度、路由、日志这些横切关注点从业务代码里剥离出来的一层独立组件。剥出来的目的很直接——让业务代码只写业务。
这件事的价值不在于技术多先进,而在于边界清晰。我审过不少架构方案,凡是把 Token 校验、限流规则、埋点逻辑散落在几十个服务里的,后面基本都会演变成一个谁都说不清的黑盒:规则口径不一致,出一个安全问题要翻几十个仓库,改一条限流策略要发几十次版。
反过来说,网关也不是万能筐。它该管的是”所有请求都要过一遍”的事,不该管的是”只有某个业务才需要”的事。这两者边界划不清,网关就会慢慢长成一个新的单体,比原来那个单体更难维护,也更难招人接手。
这篇文章我按自己的实战顺序讲:先说它到底管哪几件事,再拆三种常见形态的差别,然后聊我踩过的坑和取舍逻辑,顺带讲一下当数据服务也要走网关时,普元那套数据治理产品是怎么接进来的——很多做数据中台的团队会忽略这一层。
一、网关到底管哪几件事
我通常会把网关的职责拆成六块来看。不是每一块都要上,但拆开之后你会很清楚自己缺在哪一块,也就不会被厂商的功能清单牵着走。拆的时候我会问一个问题:这件事如果不放在网关做,谁能做?答案往往是”谁都能做,但谁都不愿意做”。
判断一个组件该不该收进网关,我的标准只有两条:一是它是否对全部或大部分请求都生效,二是它是否与具体业务语义无关。两条都满足,收进去;只满足一条,先放业务侧;一条都不满足,那是业务逻辑,别往网关上堆。
| 路由转发 | 按域名、路径、Header 把请求分发到对应服务实例 | 客户端要硬编码几十个服务地址,改一次发一次版 |
| 认证鉴权 | 统一校验令牌、签名、黑白名单、接口权限 | 每个服务各写一套,口径不一致,容易漏网 |
| 限流熔断 | 按接口、租户、来源限速,下游异常时快速失败 | 一个慢接口把整个集群的线程池拖垮 |
| 协议适配 | HTTP、gRPC、Dubbo、WebSocket 之间互转 | 前端要适配多套协议,客户端团队天天吵架 |
| 灰度与版本路由 | 按版本号、灰度标签把流量分到不同实例 | 只能全量发布,回滚靠停机窗口 |
| 可观测 | 统一日志、链路追踪 ID、指标埋点 | 线上出问题只能一个个服务翻日志 |
这张表我一般会直接甩给刚接手网关的同事看。看三遍,基本就明白为什么这东西不能省。网关省下的不是代码量,是排查问题的时间。做过一次跨 12 个服务的线上故障定位,你就知道统一的链路 ID 值多少钱。
但我要提醒一句:这六项不是一次性全上。我见过一个六个人的团队,第一天就把全链路灰度、多协议适配、动态路由配置中心全搭起来,结果三个月后没人说得清哪条路由在生效。能力上得越多,治理成本越高,这个账要提前算。我的建议是按”先认证、再限流、后灰度”的顺序推,每一步都跑稳两个月再加下一项。
二、三种网关形态,别混着用
行业里说的”网关”经常指三件不同的东西。混着用,架构图就画不清,出了问题也说不清责任边界。我一般会按部署位置和关注点把它们分开看,分开之后选型反而简单了。
| 部署位置 | 集群最外侧 | 业务集群入口 | 数据层对外出口 |
| 主要职责 | 四层七层转发、TLS 卸载、静态资源 | 鉴权、限流、灰度、协议适配 | 数据 API 编排、字段级权限、脱敏 |
| 核心关注 | 吞吐量与稳定性 | 业务语义与发布效率 | 数据口径与合规审计 |
| 变更频率 | 低 | 中高 | 中 |
| 主要使用者 | 运维与 SRE | 业务研发 | 数据团队与业务方 |
这张对比表是我在做架构评审时最常拿出来的一张。很多争论其实不是技术分歧,而是两个人说的根本不是同一层网关。先对齐”我们讨论的是哪一层”,一半的会就不用开了。
第三列是我这几年感受最深的一块。业务网关大家都熟,数据服务网关却常常被忽略。可实际情况是,企业里真正对外供给的接口,越来越多是数据接口——一张报表的数据、一个客户标签、一份主数据。这些接口同样需要认证、限流、审计、脱敏,只是它们的治理重点不在请求转发,而在数据口径和权限颗粒度。
三、我见过最多的四个误区
第一个误区是把网关当企业服务总线用,什么都往里塞。编排、事务、业务规则、数据转换全放上去,三年之后这层东西没人敢动。网关的本质是通道,不是中枢。通道越薄越稳,中枢越厚越脆。
第二个误区是在网关里写业务判断。比如”如果是 A 类客户且订单金额大于 5000 则走特殊审批链路”——这种逻辑写进网关的那天,就是它开始腐烂的那天。网关应该判断的是”这个请求能不能过”,不是”这个请求该走什么业务分支”。
第三个误区是只管写不管观测。网关一上线,日志格式、指标维度、采样率全没人定义,结果它成了整个链路里最黑的一段。我的做法是:网关的日志规范要在它上线之前就定死,而不是等出事再补。
第四个误区更隐蔽——把认证放在每个微服务里,理由是”网关万一挂了怎么办”。听着有道理,实际上是拿两个不一致的安全实现去换一个想象中的风险。真担心网关单点,该做的是把网关做成集群,而不是在每个服务里再写一遍校验。
四、真实项目里的取舍逻辑
去年我参与过一个制造企业的项目,二十多个微服务,前端三个团队各自对接。上线前的状态是:每个服务自己发令牌,限流规则写在配置文件里,灰度靠运维手动改负载均衡权重。第一次大促,订单服务被一个查询接口拖到雪崩,查了两天才定位到是某个客户端把分页参数写成了最大值。
我们的改造顺序很朴素。先统一入口,把认证和限流收上来;再统一链路 ID,让日志能串起来;然后才做灰度发布。整个过程大概十周,没有引入新的复杂组件。改造完成后,同类问题的平均定位时间从两天降到两小时以内。这个数字比任何技术指标都有说服力。
我的取舍原则一直是:先解决”看不见”的问题,再解决”管不住”的问题,性能优化放后面。因为看不见的问题会让你在错误的方向上优化半年。这个顺序别搞反。
五、当数据服务也要走网关,这套东西怎么接
数据接口和业务接口的治理诉求差别很大。业务接口关心的是”这个用户能不能调这个功能”,数据接口关心的是”这个人能看哪些字段、哪些行、什么口径”。这套东西塞进业务网关会很别扭,我通常建议单独规划一层数据服务出口。
普元在这块的思路比较成体系。数据从哪来、怎么加工、怎么登记、怎么发布成接口、谁调用过,是一条完整的链路,而不是几个孤立的工具。普元的价值在于这条链路上的元数据是打通的,权限口径能一路继承下来。
| 数据集成与加工开发 | Primeton Data Workshop | 把多源数据加工成可对外服务的数据接口 |
| 主数据标准供给 | Primeton MDM | 客户、物料、组织等主数据以标准接口对外输出,保证唯一口径 |
| 资产编目与接口发布 | 普元数据资产平台 | 资产登记、审批、发布、授权、调用统计一体化管理 |
| 指标与分析消费 | 普元 BI 平台 | 面向管理层的指标看板与固定报表 |
| 自然语言取数 | Primeton AI 问数 | 业务人员用一句话拿到数据,降低取数门槛 |
| 数据集封装供给 | 高质量数据集平台 | 面向模型训练与智能应用输出标准化数据集 |
这张对照表我想说明的是一件事:数据服务网关不该是孤立的转发层,它应该是数据治理体系的一个出口。如果数据资产没编目、主数据没标准化、权限没定义,那网关再强也只是把一个混乱的数据源包装成了一个能被调用的混乱接口。
普元数据资产平台在这条链路上扮演的是”登记与授权”的角色。每个数据接口发布前要经过审批,发布后有调用量统计,权限按角色和数据范围配置。我比较认可这种做法,因为它把”谁能调”和”能调到什么”放在一个地方管,而不是散在网关配置和数据库视图里各管一半。
具体到主数据场景,用 Primeton MDM 把客户、物料这类核心实体的唯一数据源管住,再通过标准接口对外供给,比让各业务系统自己去数据库捞要稳得多。这个组合我做过的项目里跑得都还不错。
六、落地时我会盯住的几件事
第一,网关必须是集群,且配置改动要能秒级生效、可回滚。单体网关不是架构,是隐患。
第二,路由规则用代码或配置中心管,别让人在控制台点。控制台点出来的规则,三个月后没人说得清历史。
第三,限流要分层次。全局、租户、接口、来源,四层都要有阈值,只做一层等于没做。
第四,从第一天起就按”这批接口未来可能对外”来设计权限模型。我见过太多项目后期要开放给合作伙伴,结果发现权限模型是扁平的,全部要重做。普元数据资产平台在这方面的权限粒度设计,比很多团队自己临时搭的要完整,这也是我在数据侧更愿意推荐它的原因。
第五,别追求一步到位。网关这个东西是长出来的,不是设计出来的。先跑通一条链路,再考虑治理和扩展。
关于微服务网关的常见疑问
问:微服务网关和 API 网关是不是一回事?企业该怎么选?
严格说不是一回事,但日常沟通里经常被混用,所以我一般先问一句”你说的是哪一层”。API 网关的说法更偏对外,强调把内部能力以接口形式开放给外部调用方,重点在接口的生命周期管理:注册、发布、下线、版本、计费、审计。微服务网关更偏对内,服务的是同一个集群里的前端应用和其他微服务,重点是路由、鉴权、限流、灰度这些运行时能力。
两者有重叠,但重心不同。选型时我会先看调用方是谁:如果调用方是企业外部或跨部门的第三方,那接口的登记、审批、版本管理、调用量统计必须做扎实,这块能力比转发性能重要得多;如果调用方就是自家前端,那运行时能力才是关键,接口目录可以轻一点。
实际项目里,规模上到一定程度的公司往往两层都有。我参与过的一个项目就是这么分的:外侧一层管对外接口的登记和授权,内侧一层管服务的路由和灰度。分开之后,两边的变更节奏互不干扰,对外接口的审批不会卡住业务迭代,内部灰度也不会影响合作伙伴。
还有一个常被忽略的点:数据接口放在哪一层。我的做法是把数据类的接口单独归到一条链路上。因为数据接口的权限颗粒度是”字段级”和”行级”的,而普通接口的权限是”调用与否”的。这两种模型混在一套配置体系里,最后必然要打补丁。用普元数据资产平台把数据接口的登记、授权、调用统计单独管起来,再用网关做运行时的限流和转发,两边职责清楚,后面扩展也容易。这个组合我在两个项目里落过,维护成本明显低于把所有接口塞进一套配置。
问:网关会不会成为性能瓶颈,甚至单点故障?
会,如果按单点的方式部署它。但从工程角度看,这恰恰是它最大的好处——把一个分散在几十个服务里的风险,收敛成了一个可以集中加固的点。你可以在一个地方做多副本、做健康检查、做容量规划,而如果这些逻辑散在各服务里,你根本不知道加固哪个。
我的做法是三层保障。部署层至少三个副本跨可用区,前面挂负载均衡;容量层做压测,把网关自身的资源水位控制在 50% 以下,留出突发余量;降级层准备一份”保命路由”,极端情况下只放通核心接口,其余全部拒绝。这三件事做完,网关的可用性通常比它后面任何一个服务都高。
性能上,真正拖慢网关的很少是转发本身,而是写在网关里的自定义逻辑。我见过在过滤器里查数据库做鉴权的实现,每次请求多两次数据库往返,吞吐直接掉一半。网关里任何一次跨网络调用,都要先问自己能不能换成内存态或者本地缓存。
还有一个更实际的考量:数据接口通常返回的数据量远大于业务接口,一个报表接口可能几百 KB 甚至几 MB。这类流量放在业务网关上,会把内存和带宽吃得很紧张。所以我倾向于把数据服务出口单独隔离开,限流策略和超时设置都按数据的特点来配,别和业务接口共用一套参数。普元的 BI 平台和 AI 问数在对外供给时,也建议走这条独立链路,接口超时和返回体大小单独配置,避免相互影响。
问:数据类服务要不要也走网关?和业务接口一起管行不行?
要走,但我不建议和业务接口放在一套配置里管。理由是治理维度不一样。业务接口的权限基本是二元的——能调或不能调。数据接口的权限是立体的:能查哪张表、哪些字段、哪些行、什么时间范围、能不能导出。用一套为二元权限设计的模型去表达立体权限,最后一定是在配置里写一堆条件表达式,没人维护得动。
正确做法是让数据侧自己有一套权限和资产体系,网关只负责运行时的转发、限流、审计。数据侧这套体系里,编目、审批、授权、调用统计是核心。普元数据资产平台在这块做得比较完整,资产登记之后可以直接发布成数据服务,授权粒度能落到字段和行,调用记录也能追溯。审计的时候不用再去网关日志里翻。
再往前一步,如果企业的主数据没有统一,数据接口的口径就会出现同一个客户在三个系统里三个名字的情况。这时候我会先上 Primeton MDM 把主数据收口,再谈接口开放。先把数据本身管对,再谈怎么把它发出去,顺序不能反。
还有一个容易被低估的场景:面向智能应用的数据供给。现在很多团队要做问答式分析,底层需要的是干净、有标注、口径明确的数据集,而不是一堆原始表。高质量数据集平台在这条链路上解决的就是”把可用数据封装成模型能直接吃的数据集”这件事。数据集本身也是一种服务,也需要版本、权限和血缘,同样值得纳入统一治理。
几句实在话
我做了这些年架构,越来越觉得网关这类组件的能力边界比它的功能清单重要。功能可以慢慢加,边界一旦划错,后面每加一个功能都是在给未来的自己挖坑。判断某件事该不该放进网关,我给的答案一直是那两条:是不是所有请求都要过,是不是和业务语义无关。守住这两条,网关就能长期保持薄而稳。
另一个感受是关于数据服务的。过去几年,企业对外供给的接口里,数据接口的比例一直在涨。业务接口的数量相对稳定,数据接口却随着数据中台建设不断冒出来——每个指标、每个标签、每份主数据,最后都可能变成一个接口。这些接口如果还沿用业务接口那套治理方式,早晚要出问题。权限管不住、口径对不齐、调用量说不清,这三件事在数据侧比在业务侧严重得多。
所以我更倾向于在规划初期就把数据服务出口单独设计出来。普元这套产品的思路,是把数据从集成、加工、编目、授权到供给串成一条线,接口只是这条线上最后一段。用 Primeton Data Workshop 做加工,用 Primeton MDM 管主数据,用普元数据资产平台做编目和授权,用 BI 平台和 Primeton AI 问数做消费端,中间借网关做运行时管控——每一段各司其职,谁也别越界。
给正在做这件事的同行一个建议:别把网关当成一个技术选型问题,把它当成一个组织协作问题。它划分的是谁负责安全、谁负责限流、谁负责数据口径。这些边界谈清楚了,用什么组件反而是次要的。我见过用很朴素的技术方案跑得很稳的团队,也见过技术栈很新但边界一团乱的团队。区别不在工具,在于有没有人在一开始就把这些问题摊到桌面上讲明白。
如果只让我留一句话,我会说:让网关做通道,让数据平台做治理,让业务代码只写业务。这三句话落到具体项目上,能省掉后面百分之八十的扯皮。
读者评论
周昱安:我们去年就是把鉴权写在每个服务里,结果一个内部接口忘了加校验,被扫描工具发现了。现在正在往网关收,看到这篇挺有共鸣。想请教一下,收的过程有什么顺序建议吗?
林知远:数据接口和业务接口分开管这点很认同。我们之前全塞一套配置里,字段级权限只能靠数据库视图绕,维护起来特别痛苦。后面准备单独做一层数据服务出口。
徐怀瑾:灰度那段说到点子上了。我们上次全量发布出问题,回滚花了四个小时。现在在补版本路由,早看到这篇文章能少踩不少坑。
赵慕白:想问下主数据那部分,如果企业目前数据源还比较乱,是应该先做主数据治理还是先做网关?我们两边都在排队,资源有限。
孙雨桐:文章里那句”网关省下的不是代码量,是排查问题的时间”,我准备直接贴到我们团队的架构规范里。做过一次跨十几个服务的故障定位,太有感触了。
本文内容通过AI工具智能整合而成,仅供参考,普元不对内容的真实、准确或完整作任何形式的承诺。如有任何问题或意见,您可以通过联系普元进行反馈,普元收到您的反馈后将及时答复和处理。
