结果导向 · 服务发现 / 配置管理 / 多环境 / 动态刷新 / AP-CP 切换
Nacos 是什么(一句话):阿里开源的注册中心 + 配置中心二合一,Spring Cloud Alibaba 生态核心组件。一个 Nacos 实例同时搞定服务注册发现和配置管理,比 ZK + Apollo 的组合方案省一半运维。
什么场景该用 Nacos:
| 场景 | Nacos 在里面干什么 | 不用会怎样 |
|---|---|---|
| 微服务注册发现 | 服务提供者注册,消费者拉取地址列表,自动感知上下线 | 硬编码 IP 地址,扩缩容要改代码 |
| 配置中心 | 配置集中管理,改配置秒级推送到所有实例,不用重启 | 配置散在各机器,改配置要重启所有实例 |
| 多环境管理 | Namespace 隔离 dev/test/prod,一套 Nacos 管所有环境 | 每套环境搭一套配置中心 |
| 灰度发布 | 配置按 IP/集群灰度推送,部分实例先生效 | 全量改配置,出问题全挂 |
| 服务健康检查 | 心跳检测,不健康的实例自动摘除 | 消费者调到挂掉的实例才发现 |
定位:Nacos = Naming and Configuration Service。它的核心是两个服务:服务发现(服务注册、健康检查、地址推送)和配置管理(配置存储、版本管理、动态推送)。两个服务共享同一套存储和集群,部署一个 Nacos 就全有了。
核心能力全景(6 大块):
| 维度 | Nacos | Eureka | ZooKeeper | Consul | Apollo |
|---|---|---|---|---|---|
| 注册中心 | ✅ 支持 | ✅ 支持 | ⚠️ 能做但重 | ✅ 支持 | ❌ 不支持 |
| 配置中心 | ✅ 支持 | ❌ 不支持 | ⚠️ 能做但弱 | ✅ 支持 | ✅ 专精 |
| 一致性 | AP/CP 可选 | AP | CP | CP | CP(配置) |
| 健康检查 | 心跳+探测 | 心跳 | 会话 | 探测丰富 | — |
| 配置推送 | ✅ 秒级推送 | — | ⚠️ Watch一次性 | ✅ | ✅ 秒级 |
| 多环境 | ✅ Namespace | ❌ 要多套 | ❌ 要多套 | ✅ Datacenter | ✅ 环境 |
| 运维 | ✅ 简单(Docker) | ✅ 简单 | ⚠️ 麻烦(GC) | ✅ 简单 | ⚠️ 较复杂 |
| 维护状态 | ✅ 活跃(阿里) | ⚠️ 2.x停更 | ✅ 活跃(Apache) | ✅ 活跃 | ✅ 活跃(携程) |
| 选它当什么 | ✅ 注册+配置一站式 | 仅注册(老项目) | 协调(新项目少用) | 注册+配置(多机房) | 仅配置(企业级) |
Nacos 的组织模型是四层结构:Namespace → Group → Service/Data ID → 实例/配置项。理解这个层级,多环境多业务管理就不会乱。
| 概念 | 作用 | 粒度 | 典型用法 |
|---|---|---|---|
| Namespace | 环境隔离 | 最外层 | dev / test / prod 三个 Namespace,互不影响 |
| Group | 业务分组 | Namespace 内 | DEFAULT_GROUP(默认) / PAYMENT_GROUP(支付组) / TRADE_GROUP(交易组) |
| Service / Data ID | 具体服务/配置 | Group 内 | order-service(服务名) / order-service.yaml(配置文件名) |
| Cluster | 集群(同机房) | Service 内 | BJ_CLUSTER / SH_CLUSTER,同机房优先调用 |
| Instance | 实例 | 最内层 | 192.168.1.10:8080 一个具体的服务进程 |
@Value 就读不到。这是新手最常见的坑——配了 Nacos 配置中心但不生效,90% 是配错文件了。
RefreshEvent 手动重建。
背景:订单服务有 5 个实例注册在 Nacos。某个实例 OOM 崩溃,Nacos 15 秒没收到心跳,自动摘除,消费者不再调用它。运维无需手动操作。
背景:生产环境订单接口超时时间配的 30 秒,某次下游服务慢导致大量请求堆积。需要在 Nacos 改成 10 秒,让请求快速失败,不重启应用。
背景:3 套环境(dev/test/prod),配置各不同。用 Nacos 的 Namespace 隔离,一套 Nacos 实例管理所有环境配置,不用搭 3 套配置中心。
${ENV:default} 占位符,不同环境配不同值;④每次改 prod 配置先备份版本号(Nacos 自动存版本,可一键回滚)。
现象:引了 nacos-config 依赖,Nacos 上也配了 order-service.yaml,但应用启动后 @Value 读到的还是默认值,配置没生效。
原因:配在了 application.yml 里。Nacos 配置中心必须在 bootstrap.yml 里配——bootstrap 阶段先于 application 加载,配置中心要先连上才能拉配置。配在 application.yml 里,Spring 加载到 Nacos 配置时,@Value 注入阶段已经过了。
解法:①所有 Nacos 配置中心相关配置放 bootstrap.yml;②Spring Cloud 2020+ 要额外引 spring-cloud-starter-bootstrap 依赖(默认不再加载 bootstrap)。
现象:开发同学本地调试,bootstrap.yml 的 namespace 填成了 prod 的 ID。本地改配置推送到 prod Namespace,5 个生产实例全部刷新成开发配置(数据库指向了开发库),生产全线故障。
原因:①prod Namespace 没配权限,开发能直接改;②本地配置和线上配置混在一个项目里;③没有配置变更审核机制。
解法:①prod Namespace 必须配权限,只有运维和特定账号能改;②本地开发用 dev Namespace,namespace ID 用环境变量注入而不是硬编码:namespace: ${NACOS_NS:dev-ns-id};③prod 配置变更开启审核(Nacos 企业版支持)。
现象:在 Nacos 改了数据库连接池配置(max-size: 50 → 100),@RefreshScope 的 Bean 确实刷新了,但监控显示连接池还是 50。改了等于没改。
原因:HikariCP 连接池在启动时根据配置初始化,@RefreshScope 只是重建了配置 Bean,不会自动重建连接池。连接池对象在 JVM 里还是旧的,配置改了它不知道。
解法:①监听 RefreshEvent 事件,手动销毁旧连接池重建;②连接池类配置不要放 Nacos 动态刷新,改了要重启;③只把"运行时可调"的参数(超时/重试/开关)放 Nacos,"启动时初始化"的参数(连接池/线程池大小)放本地配置文件。
现象:Nacos 3 台集群全部宕机(机房断电),所有微服务无法注册/发现,新实例起不来,消费者拉不到地址,全线调用失败。
原因:Nacos 客户端有本地缓存(failover),但默认不开启。Nacos 挂了,客户端没有地址列表可用。
解法:①开启客户端本地缓存:spring.cloud.nacos.discovery.cache-dir=./nacos/cache,Nacos 挂了用缓存的地址列表顶一阵;②Nacos 集群跨机房部署(3 台分 2 机房),单机房挂了还有另一机房;③Nacos 集群配MySQL 持久化,重启后数据不丢;④监控 Nacos 健康,挂了立刻告警。Nacos 是单点风险,必须高可用部署。
新项目选 Nacos。理由:
• 功能全:Nacos 注册+配置一站式,ZK 只能做注册(配置太弱)。
• AP 模式更适合微服务:Nacos 心跳机制对 GC 假死更宽容,ZK 会话超时会误判下线。
• 运维简单:Nacos 单二进制+Docker 友好,ZK 是 Java 进程有 GC 问题。
• 生态:Spring Cloud Alibaba 原生支持 Nacos,ZK 要额外配置。
ZK 做注册中心的场景:Dubbo 老项目(ZK 是 Dubbo 默认)、Kafka 元数据存储(Kafka 内置依赖)。新项目别用 ZK 做注册中心。
Nacos 两种模式自动选择,你一般不用管:
• AP 模式(默认,临时实例):服务注册用 AP。客户端主动心跳,Nacos 节点间最终一致。可用性高,适合微服务。90% 场景用这个。
• CP 模式(永久实例):永久实例注册用 CP。Nacos 主动探测,节点间强一致。适合数据库/缓存等基础设施。
手动切换:spring.cloud.nacos.discovery.ephemeral: false(改为永久实例,走 CP)。微服务别改,用默认 AP 就行。
排查清单(按优先级):
① 配在 bootstrap.yml 了吗?(不是 application.yml)——90% 是这个问题。
② 加了 @RefreshScope 吗?——没加注解的 Bean 不会刷新。
③ Data ID 对吗?——默认是 ${spring.application.name}.${file-extension},比如 order-service.yaml。
④ Namespace 和 Group 对吗?——Namespace 用的是 ID 不是名字,容易填错。
⑤ 配置是启动时初始化的吗?——连接池/线程池类配置改了不会自动重建,要重启。
⑥ 看 Nacos 控制台推送日志——确认推送成功没。
最少 3 台(和 ZK 一样要奇数台,过半写成功)。
部署要点:
• 3 台 Nacos Server,跨机房部署(2+1 或 1+1+1)。
• 共用一个 MySQL(主从),存配置数据(服务注册数据在内存)。
• 前面挂 Nginx/LB,客户端连 LB 地址。
• 每台配 cluster.conf 列出所有节点 IP。
生产推荐 3 台起步,大规模(1000+ 服务)用 5-7 台。不要单机部署生产——Nacos 挂了整个微服务体系瘫痪。
两个都能做配置中心,区别:
• Nacos:注册+配置一站式,配置功能够用。适合 Spring Cloud Alibaba 生态。
• Apollo:纯配置中心,功能更专业(灰度发布更细、权限管理更强、多语言客户端全)。
选型建议:Spring Cloud 项目 → Nacos(省一个组件)。对配置管理有极致要求(大型企业、多团队、细粒度权限)→ Apollo。90% 团队 Nacos 配置功能够用了,没必要上 Apollo。
1. 定位:注册中心+配置中心一站式,Spring Cloud Alibaba 核心。一个组件干 ZK+Apollo 两个的活。
2. 组织模型:Namespace(环境) → Group(业务) → Service/Data ID(服务/配置) → Instance。prod Namespace 必须配权限。
3. 配置中心必踩坑:配在 bootstrap.yml 不是 application.yml;@RefreshScope 要加;启动时初始化的配置(连接池)改了要重启;Nacos 集群必须 3 台+跨机房。
相关专题:ZooKeeper 专题 · API与微服务决策 · Redis 专题
全栈资料库 · Nacos 注册中心与配置中心实战