有了 Nacos,为什么还需要网关?
很多刚接触微服务架构的朋友常有一个疑问:既然已经有了 Nacos 这样的注册中心,服务之间都能互相找到了,为什么还要在前面加一个网关?这难道不是多此一举吗?
其实,Nacos 和网关根本不是替代关系,而是上下游的协作关系。打个比方,Nacos 是公司内部的员工通讯录,而网关是公司的前台接待。

本文将理清这两个组件各自的核心职责,分析如果去掉其中一个系统会出什么问题,以及它们在实际请求链路中是如何配合的。
Nacos:解决“服务在哪”的问题
Nacos 的核心任务是解决服务发现的问题,即“服务在哪”。
在微服务架构中,一个系统会被拆分成几十甚至上百个小服务。每个服务可能部署在多台服务器上,且 IP 地址可能随时发生变化。Nacos 就像一本动态更新的内部通讯录:
- 服务注册:每个微服务启动时,都会把自己的地址登记到 Nacos 上。
- 服务发现:当服务 A 需要调用服务 B 时,可以通过 Nacos 获取 B 当前可用的实例地址。

Nacos 主要负责服务注册、发现以及相关服务治理能力,它不负责帮你接待外面的客人,也不处理外部请求的通用逻辑。
网关:解决“外部请求怎么进”的问题
网关解决的是外部请求如何进入系统以及通用逻辑由谁管理的问题。
网关通常是整个微服务系统对外的统一入口。如果没有网关,让手机 App 或网页直接去调用后端的几十个微服务,你将面临以下问题:
- 代码分散:需要在多个微服务里分别处理用户登录校验、权限判断、访问限流等通用逻辑。
- 维护困难:一旦要修改鉴权规则,多个服务都可能需要跟着调整。
有了网关,这些通用的拦截逻辑就可以集中在“大门”处处理,后端的微服务只需要专心做自己的业务逻辑。

为什么不能只保留其中一个?
场景一:只保留网关,去掉 Nacos
技术上能跑,但前提是你还得有其他服务发现机制。如果既没有 Nacos,也没有其他动态服务发现能力,网关就可能只能依赖静态路由,即在配置文件里维护微服务的实例地址。
- 缺乏弹性:一旦某台服务器宕机,或者服务发生扩缩容,网关就无法及时感知这些变化。
- 无法负载均衡:有了 Nacos,网关可以获取动态变化的服务实例列表,再配合负载均衡完成路由,并尽量避开已经被判定为异常的节点。
场景二:只保留 Nacos,去掉网关
技术上同样可以,但如果让前端客户端直接去查询服务地址、处理请求分发和身份校验,会带来严重隐患:
- 客户端复杂化:客户端将承担大量本不该承担的复杂逻辑。
- 安全暴露:内部的服务结构可能直接暴露给外部,增加安全风险。
网关的存在,就是为了把微服务的内部结构封装起来,对外提供一个相对统一的访问入口。
实际请求链路中的协作
在真实的运转中,Nacos 和网关通常会形成一套连贯的“组合拳”。当用户在手机上点击一个按钮,请求链路如下:
- 请求接入:请求首先打到网关。
- 安全校验:网关先检查用户的登录状态和权限。
- 路由决策:确认没问题后,网关根据路由规则,确定这个请求应该交给哪个服务(例如服务 A)。
- 服务发现:网关通过 Nacos 获取服务 A 当前可用的实例列表。
- 负载均衡与转发:网关根据负载均衡策略,把请求转发给具体的微服务实例。

总结
理清了这条链路,你就会明白:
- Nacos 主要负责服务注册、发现和相关服务治理能力,管的是内部联络。
- 网关 主要负责外部流量接入、路由以及通用安全控制,管的是外部接待。
二者各司其职,配合起来才能让微服务系统更灵活、更容易管理。