有了 Nacos,为什么还需要网关?

有了 Nacos,为什么还需要网关?

很多刚接触微服务架构的朋友常有一个疑问:既然已经有了 Nacos 这样的注册中心,服务之间都能互相找到了,为什么还要在前面加一个网关?这难道不是多此一举吗?

其实,Nacos 和网关根本不是替代关系,而是上下游的协作关系。打个比方,Nacos 是公司内部的员工通讯录,而网关是公司的前台接待。

Nacos 与网关的角色隐喻

本文将理清这两个组件各自的核心职责,分析如果去掉其中一个系统会出什么问题,以及它们在实际请求链路中是如何配合的。

Nacos:解决“服务在哪”的问题

Nacos 的核心任务是解决服务发现的问题,即“服务在哪”。

在微服务架构中,一个系统会被拆分成几十甚至上百个小服务。每个服务可能部署在多台服务器上,且 IP 地址可能随时发生变化。Nacos 就像一本动态更新的内部通讯录:

  1. 服务注册:每个微服务启动时,都会把自己的地址登记到 Nacos 上。
  2. 服务发现:当服务 A 需要调用服务 B 时,可以通过 Nacos 获取 B 当前可用的实例地址。

Nacos 服务注册与发现机制

Nacos 主要负责服务注册、发现以及相关服务治理能力,它不负责帮你接待外面的客人,也不处理外部请求的通用逻辑。

网关:解决“外部请求怎么进”的问题

网关解决的是外部请求如何进入系统以及通用逻辑由谁管理的问题。

网关通常是整个微服务系统对外的统一入口。如果没有网关,让手机 App 或网页直接去调用后端的几十个微服务,你将面临以下问题:

  • 代码分散:需要在多个微服务里分别处理用户登录校验、权限判断、访问限流等通用逻辑。
  • 维护困难:一旦要修改鉴权规则,多个服务都可能需要跟着调整。

有了网关,这些通用的拦截逻辑就可以集中在“大门”处处理,后端的微服务只需要专心做自己的业务逻辑。

网关集中处理通用逻辑的优势

为什么不能只保留其中一个?

场景一:只保留网关,去掉 Nacos

技术上能跑,但前提是你还得有其他服务发现机制。如果既没有 Nacos,也没有其他动态服务发现能力,网关就可能只能依赖静态路由,即在配置文件里维护微服务的实例地址。

  • 缺乏弹性:一旦某台服务器宕机,或者服务发生扩缩容,网关就无法及时感知这些变化。
  • 无法负载均衡:有了 Nacos,网关可以获取动态变化的服务实例列表,再配合负载均衡完成路由,并尽量避开已经被判定为异常的节点。

场景二:只保留 Nacos,去掉网关

技术上同样可以,但如果让前端客户端直接去查询服务地址、处理请求分发和身份校验,会带来严重隐患:

  • 客户端复杂化:客户端将承担大量本不该承担的复杂逻辑。
  • 安全暴露:内部的服务结构可能直接暴露给外部,增加安全风险。

网关的存在,就是为了把微服务的内部结构封装起来,对外提供一个相对统一的访问入口。

实际请求链路中的协作

在真实的运转中,Nacos 和网关通常会形成一套连贯的“组合拳”。当用户在手机上点击一个按钮,请求链路如下:

  1. 请求接入:请求首先打到网关。
  2. 安全校验:网关先检查用户的登录状态和权限。
  3. 路由决策:确认没问题后,网关根据路由规则,确定这个请求应该交给哪个服务(例如服务 A)。
  4. 服务发现:网关通过 Nacos 获取服务 A 当前可用的实例列表。
  5. 负载均衡与转发:网关根据负载均衡策略,把请求转发给具体的微服务实例。

实际请求链路中的协作流程

总结

理清了这条链路,你就会明白:

  • Nacos 主要负责服务注册、发现和相关服务治理能力,管的是内部联络。
  • 网关 主要负责外部流量接入、路由以及通用安全控制,管的是外部接待。

二者各司其职,配合起来才能让微服务系统更灵活、更容易管理。