100+微服务的统一出入口:政策快报平台的API网关设计

政策快报平台的后端服务,从最初的一个单体应用,拆分成了现在的100多个微服务。

服务多了,问题也多了:

  • 每个服务都要做鉴权,代码重复

  • 每个服务都要限流,各自为政

  • 出了问题,不知道是哪个服务挂了

  • 前端要调用几十个不同的接口地址,管理混乱

2024年,我们做了一件事:把所有服务的出入口统一收归到一个API网关。网关作为唯一入口统一处理鉴权、限流、路由、监控,后端服务只负责业务逻辑。

做这件事之前,我们花了两周时间调研方案、梳理已有的服务清单、评估改造范围。网关本身不复杂,但改动的边界需要想清楚------哪些功能应该由网关统一处理,哪些应该下放到业务服务自己控制。想清楚之后,才开始动手。

4个核心功能

功能一:统一鉴权

网关之前,每个服务都要自己验证Token、解析用户信息。重复代码多,还容易出漏洞。

网关之后:Token验证统一在网关层完成。验证通过后,网关把用户信息(user_id、权限等)注入到请求头里,下游服务直接使用。下游服务不再需要关心Token怎么解析、怎么验证------只管业务逻辑,拿到user_id就用。

功能二:统一限流和熔断

网关之前,每个服务独立限流。一个服务被冲垮,不会影响其他服务。但问题是:如果某个服务的流量突然暴增,网关会先感知到。

网关之后:在网关层统一配置限流规则。某个接口超过阈值,网关直接返回"繁忙",请求根本不会打到下游服务。同时,网关会对异常情况(响应超时、错误率超限)自动触发熔断,快速失败而非长时间阻塞。

功能三:统一路由

网关之前,前端要记住几十个不同的服务地址:policy-api、user-api、search-api、recommend-api......每个服务一个域名或路径,前端配置混乱,联调效率低。

网关之后:前端只需要记住一个域名。所有请求都发到网关,网关根据路径(如/api/policy/xxx)自动路由到对应服务。前后端对接成本大幅降低。

功能四:统一监控

网关是请求进出的必经之路,所以它也是采集流量数据的最佳位置。网关记录每个请求的路径、响应时间、状态码、用户ID------这些数据成为全链路监控和告警的数据基础。

网关的技术选型

在技术选型上,对比了Kong和Spring Cloud Gateway:

Kong功能全面(基于Nginx+OpenResty),性能好,适合大规模生产环境,但运维成本较高,需要单独部署和管理。Spring Cloud Gateway是Spring生态的一部分,与现有Java技术栈天然兼容,易于开发和定制,但性能略低于Kong。考虑到团队技术栈和后期的可维护性,选择了Spring Cloud Gateway,便于团队快速上手和持续迭代。

关于部署架构:网关本身是无状态的,可以水平扩展。目前生产环境部署了3个节点,日常单节点处理约2万QPS,瓶颈主要在下游服务。网关层面预留了横向扩展的能力,如果流量继续增长,可以直接增加节点数。

遇到的几个问题

问题一:网关成了单点故障

网关是唯一入口,它挂了所有服务都挂。解决方案:网关部署3个节点,前置负载均衡(SLB),单节点故障自动切换。

问题二:超时时间难配置

不同服务的响应时间不同:查询类服务要求快(秒级),导出类服务可能慢(几十秒)。网关的超时时间不能一刀切。解决方案:网关支持按路由配置超时。查询服务设3秒超时,导出服务设60秒超时。

问题三:网关成了性能瓶颈

所有请求都经过网关,网关自身的处理能力很重要。解决方案:网关层尽量轻量------不处理业务逻辑,只做路由、鉴权、限流。复杂逻辑下沉到服务层,网关只做"快递员",不做"加工厂"。

结尾

API网关的核心价值,不是"技术多先进",是"边界多清晰"。网关负责"怎么进、怎么出",服务负责"做什么"。各司其职,系统才稳定。

相关推荐
摇滚侠2 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 26-40
java·云原生·kubernetes
极***技2 小时前
2026云原生核心!Go高并发限流实战,从原理到落地
开发语言·云原生·golang
万联WANFLOW15 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
踩着两条虫15 小时前
可视化 vs 终端 vs 云端:VTJ.PRO、Claude Code、Codex 三强横评
前端·vue.js·人工智能·低代码·架构
Fabarta15 小时前
从 0 实现 ChatGPT 风格的流式对话 UI
算法·架构
搭贝16 小时前
低代码平台私有化部署架构与信创全栈适配实战
低代码·架构·rxjava
学渣超17 小时前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构
小短腿的代码世界17 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界18 小时前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构