Nacos 是什么?为什么国内微服务大多用 Nacos?和 Eureka、Config 有什么区别?
简化版
Nacos(阿里开源)是一个**「注册中心 + 配置中心」二合一的组件——一个 Nacos 既能做服务注册发现(替代 Eureka),又能做动态配置管理(替代 Spring Cloud Config),国内微服务几乎成了标配。它比 Eureka 强的地方:① 注册配置一体化(部署一个就够,不用同时搭 Eureka + Config);② 支持 AP/CP 切换(默认 AP 高可用,也可切 CP 强一致,Eureka 只有 AP);③ 配置动态推送(Nacos 用长轮询让配置变更秒级推送**到客户端,而 Spring Cloud Config 需要手动触发刷新 + 消息总线广播);④ 有可视化控制台(配置、服务一目了然)。加上国内生态成熟、中文文档友好,所以成了主流。
详细版
Nacos 的两大功能:
Nacos = 服务注册发现(Naming)+ 动态配置管理(Config)
注册中心:服务启动时注册到 Nacos,消费者从 Nacos 拉取服务列表 + 订阅变更
配置中心:配置存在 Nacos,应用启动时拉取,配置变更时 Nacos 主动推送给应用
Nacos vs Eureka(注册中心对比):
| 维度 | Eureka | Nacos |
|---|---|---|
| 功能 | 只做注册中心 | 注册中心 + 配置中心 |
| 一致性 | 只有 AP | AP/CP 可切换 |
| 健康检查 | 客户端心跳 | 心跳 + 主动探测(TCP/HTTP/MySQL) |
| 服务变更感知 | 客户端定时拉取(有延迟) | 推送 + 拉取(更实时) |
| 控制台 | 简单 | 功能丰富的可视化控制台 |
| 维护状态 | Netflix 已停止新功能 | 阿里活跃维护 |
Nacos Config vs Spring Cloud Config(配置中心对比):
| 维度 | Spring Cloud Config | Nacos Config |
|---|---|---|
| 配置存储 | Git 仓库(或本地) | Nacos 自带存储(+ MySQL 持久化) |
| 配置刷新 | 手动 /actuator/refresh + Bus 广播 | 自动长轮询推送,秒级生效 |
| 配置隔离 | profile | namespace(环境)+ group(分组)+ dataId |
| 控制台 | 无 | 有(在线编辑、历史版本、灰度) |
⚠️ Nacos 的 AP/CP 切换是它的一个亮点,但要理解它是「按服务实例类型」而非「整体」切换:注册的实例分临时实例(默认,AP 模式,靠心跳,用 Distro 协议) 和持久实例(CP 模式,靠 Raft 协议,即使宕机也保留记录)。大多数微服务用临时实例(AP,高可用优先),DNS 类需要持久记录的场景才用持久实例(CP)。这和「Eureka 纯 AP、Zookeeper 纯 CP」不同——Nacos 更灵活。
完整版教学
一、Nacos 的定位:注册 + 配置一体化
传统 Spring Cloud Netflix 方案里,注册中心和配置中心是两个独立组件——注册用 Eureka、配置用 Spring Cloud Config,要分别部署、分别维护。Nacos 的第一个价值就是把它们合二为一:
Netflix 方案:
Eureka(注册中心)+ Spring Cloud Config(配置中心)
→ 部署两套、维护两套、两个控制台
Nacos 方案:
一个 Nacos 同时提供注册发现 + 配置管理
→ 部署一套、一个控制台、运维成本减半
这个「一体化」的意义不只是省事——注册和配置在微服务里都是「服务治理」的基础设施,用一个组件统一管理,架构更简洁、依赖更少。理解「Nacos = 注册中心 + 配置中心二合一」,就理解了它为什么能替代「Eureka + Config」两个组件,也理解了它成为国内主流的第一个原因:用一个组件解决了两件事。
二、作为注册中心:比 Eureka 强在哪
Nacos 的注册发现功能和 Eureka 类似(服务注册、心跳保活、服务发现),但有几处增强:
① AP/CP 可切换(Eureka 只有 AP):
Nacos 临时实例用 AP(Distro 协议,高可用,宕机快速剔除)
Nacos 持久实例用 CP(Raft 协议,强一致,记录持久保留)
→ 按需选择一致性,Eureka 只能 AP
② 健康检查更强:
Eureka 只靠客户端心跳
Nacos 支持心跳 + 服务端主动探测(TCP/HTTP/MySQL 探测)
→ 能更准确地判断实例是否真的健康
③ 服务变更推送:
Eureka 客户端定时拉取服务列表(有秒级延迟)
Nacos 支持推送 + 拉取,变更能更快通知消费者
核心增强是**「AP/CP 灵活切换」和「更实时的变更感知」**。Eureka 是纯 AP(为了高可用牺牲一致性,且有自我保护机制导致过期实例不及时剔除),Nacos 让你能按场景选一致性模型,且健康检查和变更推送更及时。加上 Netflix 已停止 Eureka 的新功能开发,Nacos 在活跃维护,所以注册中心这块 Nacos 明显更优。
三、作为配置中心:长轮询推送是杀手锏
Nacos 作为配置中心,最大的优势是配置变更能「秒级自动推送」到所有应用,这比 Spring Cloud Config 的刷新机制先进得多:
Spring Cloud Config 的配置刷新(繁琐):
配置改了(改 Git)→ 要手动调每个实例的 /actuator/refresh
或用 Spring Cloud Bus(消息总线)广播刷新事件
→ 步骤多、依赖 MQ、不够实时
Nacos Config 的配置推送(自动、秒级):
配置在控制台改了 → Nacos 主动推送给所有订阅该配置的应用
→ 应用自动感知、秒级生效,无需手动触发、无需 MQ
关键机制是长轮询(Long Polling):
Nacos 配置推送的长轮询机制:
1. 客户端向 Nacos 发起一个"长轮询"请求(问:配置变了吗?)
2. Nacos 不立即返回,而是 hold 住这个请求(默认最多 30 秒)
3. 在这期间:
- 配置变了 → Nacos 立即响应这个请求(告诉客户端"变了,来拉新配置")→ 秒级推送
- 配置没变 → 30 秒后返回"没变",客户端再发起下一次长轮询
→ 兼顾了"实时性"(变了立即通知)和"低开销"(不是高频轮询)
长轮询是 Nacos 配置中心的核心——它用「服务端 hold 请求 + 变更时立即响应」实现了「近乎推送」的实时性,又避免了「客户端高频短轮询」的资源浪费。这就是「Nacos 配置秒级生效」的技术原理,也是它比 Spring Cloud Config 好用的关键。
四、配置隔离:namespace / group / dataId
Nacos 用三层结构管理配置的隔离,这是实际使用中必须懂的:
namespace(命名空间):最外层隔离,通常按"环境"分
→ dev / test / prod 各一个 namespace,配置完全隔离
group(分组):中层,通常按"业务模块/项目"分
→ ORDER_GROUP / USER_GROUP
dataId(配置集):最内层,一个具体的配置文件
→ order-service.yaml、user-service.yaml
定位一个配置 = namespace + group + dataId 三者确定
这套结构解决了「多环境、多项目、多配置」的隔离问题:namespace 隔离环境(dev 的配置绝不会影响 prod)、group 隔离业务(订单和用户的配置分开)、dataId 对应具体配置文件。比 Spring Cloud Config 只用 profile 区分环境要灵活得多。实践中:一个 Nacos 集群服务多个环境(用 namespace 分)、多个项目(用 group 分),配置管理清晰有序。理解这三层隔离,才能正确组织微服务的配置。
五、Nacos 的架构与高可用
Nacos 生产部署要考虑高可用(它是基础设施,挂了整个微服务体系瘫痪):
Nacos 集群部署:
多个 Nacos 节点组成集群(通常 3 个或以上,奇数便于选举)
+ 外部 MySQL 存储配置数据(配置持久化,节点无状态)
+ 前面挂负载均衡(Nginx/VIP)供客户端访问
一致性协议(Nacos 内部):
临时实例(服务注册,AP):Distro 协议——各节点分担一部分数据,最终一致
持久实例 + 配置(CP):Raft 协议——强一致,Leader 选举
关键点:Nacos 内部对「服务注册的临时实例」和「配置/持久实例」用了不同的一致性协议——服务注册量大、变化频繁、要求高可用,用 AP 的 Distro(各节点分担数据、最终一致);配置和持久实例要求强一致,用 CP 的 Raft。这种「按数据特性选协议」的设计,让 Nacos 既能扛住海量服务注册(AP),又能保证配置强一致(CP)。客户端还会缓存拉取到的服务列表和配置(本地快照),即使 Nacos 短暂不可用,应用仍能用缓存运行——这是最后一道容灾防线。
六、为什么国内主流:综合优势
把前面的点汇总,就能回答「为什么国内微服务大多用 Nacos」:
| 优势 | 说明 |
|---|---|
| 一体化 | 注册 + 配置一个组件搞定,运维成本低 |
| AP/CP 灵活 | 按场景选一致性,Eureka 做不到 |
| 配置秒级推送 | 长轮询实现近乎实时,比 Config 的手动刷新好用 |
| 可视化控制台 | 配置在线编辑、历史版本、灰度、服务列表一目了然 |
| 生态成熟 | Spring Cloud Alibaba 全家桶的核心,和 Sentinel/Seata 无缝配合 |
| 国内友好 | 阿里维护、中文文档、社区活跃、大厂验证 |
再加一个时代背景:Netflix 的 Eureka、Hystrix 等组件已停止新功能开发(进入维护模式),Spring Cloud 官方也在推荐替代方案,而 Spring Cloud Alibaba 全家桶(Nacos + Sentinel + Seata)活跃且完整,正好填补空缺。所以国内微服务从「Spring Cloud Netflix」转向「Spring Cloud Alibaba」,Nacos 作为其核心(注册+配置)自然成了主流。这是「技术演进 + 生态成熟 + 国内适配」共同的结果。
记忆钩子:「Nacos = 注册中心 + 配置中心二合一(阿里,国内主流);比 Eureka 强在 AP/CP 可切换(临时实例 Distro-AP、持久实例 Raft-CP)+ 健康检查更强 + 变更推送;配置比 Spring Cloud Config 强在长轮询秒级推送(服务端 hold 请求、变更立即响应)+ namespace/group/dataId 三层隔离 + 控制台;客户端缓存做容灾」。
七、常见误区与追问
- 误区:Nacos 只是注册中心。 它是注册中心 + 配置中心二合一,一个组件同时替代 Eureka 和 Spring Cloud Config,这是它的核心优势之一。
- 误区:Nacos 和 Eureka 一样只有 AP。 Nacos 支持 AP/CP 切换——临时实例用 AP(Distro 协议)、持久实例用 CP(Raft 协议),比 Eureka 纯 AP 更灵活。
- 误区:Nacos 配置刷新也要手动触发。 不用——Nacos 用长轮询让配置变更秒级自动推送到客户端;手动 /actuator/refresh + Bus 广播是 Spring Cloud Config 的做法。
- 误区:Nacos 挂了微服务就瘫痪。 客户端会缓存服务列表和配置(本地快照),Nacos 短暂不可用时应用仍能用缓存运行,是容灾防线;但长期不可用会影响服务变更感知。
- 追问:Nacos 配置的长轮询是怎么工作的? 客户端发起长轮询请求,Nacos hold 住(默认最多 30 秒);期间配置变了就立即响应通知客户端来拉新配置(秒级推送),没变就 30 秒后返回、客户端再发起下一次——兼顾实时性和低开销。
- 追问:Nacos 的临时实例和持久实例有什么区别? 临时实例(默认)靠心跳保活、宕机自动剔除、用 AP(Distro);持久实例即使宕机也保留记录、用 CP(Raft);大多数微服务用临时实例(高可用),DNS 类需持久记录才用持久实例。
- 追问:Nacos 的 namespace、group、dataId 分别隔离什么? namespace 隔离环境(dev/test/prod)、group 隔离业务模块/项目、dataId 对应具体配置文件;三者共同定位一个配置,实现多环境多项目的配置隔离。
八、加强记忆
Nacos(阿里开源)是**「注册中心 + 配置中心」二合一的服务治理组件,国内微服务的事实标准。作为注册中心**,它比 Eureka 强在:AP/CP 可切换(临时实例用 AP 的 Distro 协议高可用、持久实例用 CP 的 Raft 协议强一致,Eureka 只有 AP)、健康检查更强(心跳+主动探测)、变更推送更实时。作为配置中心,它比 Spring Cloud Config 强在:配置秒级自动推送——用长轮询(客户端发请求、Nacos hold 住最多 30 秒、配置一变就立即响应通知,兼顾实时和低开销),而 Config 要手动 /actuator/refresh + Bus 广播;还有 namespace(环境)/group(业务)/dataId(配置文件)三层隔离和可视化控制台。生产用集群 + 外部 MySQL 持久化部署,客户端缓存服务列表和配置做容灾。国内主流的原因是「注册配置一体化 + AP/CP 灵活 + 配置秒级推送 + 控制台 + Spring Cloud Alibaba 生态成熟 + Netflix 组件停更」综合作用。一句话「Nacos 注册配置二合一、AP/CP 可切、配置长轮询秒级推送、三层隔离、Netflix 停更后成国内主流」。