智汇 IT
城启新篇

API网关 那些跑过生产才懂的事

上个月跟之前在电商平台做架构的老周吃夜宵,他灌了半瓶冰啤酒才吐槽,去年618大促的凌晨三点,他们整个监控大屏全是红色告警。 不是网关扛不住流量。 是个刚上线的内部运营工具,没走统一鉴权,直接绕开网关调了内部的用户查询接口,一秒钟发了八千次请求,直接把用户库的连接池打满,连带影响了所有正常下单的用户。 折腾了两个多小时才恢复,算下来损失了小几百万。 他说最窝火的是,团队花了大价钱搭的API网关,最后连最基础的流量拦截都没做到,完全成了个摆看的门面。

别把网关只当个流量转发的壳

很多团队刚上API网关的时候,认知还停留在“把Nginx换个带控制台的版本”。 路径转发、域名解析,完事。 剩下的鉴权逻辑散在每个业务服务的代码里,限流规则写在每个服务的配置文件里,访问日志存在各自的本地磁盘上。我见过最夸张的团队,三个业务线的鉴权逻辑写了三个完全不一样的版本,有的校验JWT,有的校验Session,还有的直接靠前端传个用户ID就放行。 真出了安全问题,你都不知道从哪补窟窿。
微服务架构API网关流量转发链路示意图
微服务架构API网关流量转发链路示意图
去年他们压测的时候,新上的一个拼团服务没做接口限流,直接把下游的订单服务打满。排查的时候,他们翻了三个不同的日志系统,跨了五个服务的链路,花了两个小时才定位到是哪个请求出的问题。 你说这网关,上了跟没上有啥区别? API网关从本质上是整个微服务体系的统一流量入口,所有从外部进来的请求,都必须经过这道关卡。它不是用来凑架构图谱的装饰品,是帮你把所有散落在各个角落的通用能力,统一收口的地方。

那些没人提前说的落地坑

踩的坑多了,你就会发现,很多团队把网管用废,根本不是产品不好,是从一开始的定位就错了。 别什么逻辑都往网关里塞。 我之前见过一个做内容社区的团队,把用户标签计算、内容敏感词过滤、甚至评论区的表情转码逻辑,全写在网关的自定义插件里。最后网关处理每个请求的平均耗时比原来多了120ms,高峰期CPU直接打满,整个链路的响应时间涨了三倍,用户刷内容的时候卡得像2G网络。 网关只做所有业务都要用到的横切能力,绝对不要把具体的业务逻辑塞进来。你塞进去的业务逻辑越多,网关的维护成本就越高,最后改个小需求都要动网关的版本,得不偿失。 也别随便给业务方开放网关的插件自定义权限。 去年有个做在线教育的朋友踩过这个坑,他们为了方便业务快速迭代,允许各个业务团队自己写Java插件上传到网关运行。结果有个新人写的插件没做异常捕获,遇到一个空指针直接把整个网关的线程池打满,所有经过网关的请求全部返回502,整整宕机了17分钟,当天正在上的直播课直接断流,被用户投诉到了教育局。
API网关插件异常导致服务熔断的监控大盘截图
API网关插件异常导致服务熔断的监控大盘截图
真的,这种坑踩一次,你半年都缓不过来。

小团队也能直接抄的实用方案

很多人觉得API网关是大厂的专属,小团队根本用不上。 错。 如果你的团队有三个以上的对外服务,不管规模多大,都值得搭个简单的网关。而且根本不用从零开始自研,流量没到十万QPS的话,直接用开源的APISIX或者Kong就够了,别瞎折腾自研,光维护插件兼容性就能把你熬得头秃。 具体要做的事其实很简单。 把鉴权能力统一收到网关层。不管你用的是JWT还是OAuth,所有外部请求进来,先在网关层做身份校验,校验不通过的直接拦掉,根本不让你进到业务服务里。别再让每个业务服务自己写鉴权逻辑,漏一个就是安全漏洞。 把限流规则统一放到网关控制台。不管是针对单个接口的QPS限制,还是针对单个用户的请求频率限制,直接在网关配置好,后面要调整规则的时候,不用给每个服务发版,改个配置点下发布就生效。 在网关层统一采集全链路的请求ID。每个进来的请求,网关都给生成一个唯一的追踪ID,透传到后面所有的服务日志里。后面排查问题的时候,顺着这个ID就能把全链路的日志串起来,不用在各个系统之间来回跳着找日志。 不过话说回来,也别把网关吹成万能药。 如果你就是做个内部的小工具,总共两个服务,日活不到一百,那真没必要上网关。直接用Nginx做个简单的路径转发就完事,上了反而多了个要维护的组件,平白增加成本。 我见过太多团队为了赶架构时髦,硬在业务规模还没到的时候上一堆复杂组件,最后组件没帮上业务,反而成了拖慢迭代的累赘。 技术选型这东西,从来不是越复杂越好。 适合自己当下的规模,能解决实际问题,就够了。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。如有侵权请联系删除。
文章名称:API网关 那些跑过生产才懂的事
文章链接:https://m.itcdj.com/news/706.html