Nacos FAQ
内容:基础、注册中心、配置中心、集群、高可用、原理、性能、运维、Spring Cloud Alibaba 集成等。
Nacos 是阿里开源的 服务注册中心 + 配置中心,两个核心能力:
-
Naming(注册中心)
- 服务注册/发现
- 健康检查
- 负载均衡
-
Config(配置中心)
- 配置热更新
- 配置监听
- 多环境隔离
- Gray 配置(灰度)
核心目标是帮助微服务治理。
| 特性 | Nacos | Eureka |
|---|---|---|
| 注册中心支持 | ✅(强) | ✅ |
| 配置中心 | ✅(强) | ❌ |
| 集群一致性协议 | Distro + Raft | AP |
| 健康检查 | 服务端主动检查 | 客户端心跳 |
| gRPC 通信 | ✅(强) | ❌ |
| 动态配置 | ✅ | ❌ |
| 权限控制 | ✅ | ❌ |
Nacos 是“注册中心 + 配置中心”,功能远强于 Eureka。
- Standalone(单机模式)
- Cluster(集群模式)
- Embedded(嵌入式,使用 Derby 数据库)
生产必须用 集群 + MySQL。
客户端通过 gRPC(9848)向 Nacos 发送:
- 实例 IP
- Port
- Weight
- Ephemeral(临时实例)
- Metadata
Nacos 接收后写入内存并持久化到 MySQL(非临时)。
| 类型 | 临时实例 | 非临时实例 |
|---|---|---|
| 是否依赖心跳 | 是 | 否 |
| 心跳丢失是否下线 | 会 | 不会 |
| 是否持久化到 DB | 否 | 是 |
| 多用于 | 微服务 | 物理设备/IoT |
Nacos 支持两种:
- 客户端心跳(默认)
- 服务端主动探测(HTTP/TCP 检查)–可选
临时实例依赖心跳。
- 推送实时性高
- 集群同步快
- 双向流通信,效率高
- 替代了旧的 HTTP 长轮询
常见原因:
- gRPC(9848)被防火墙拦截
- 客户端心跳丢包
- K8S LivenessProbe 太严格
- 不同节点数据不同步
Nacos 2.x 使用 gRPC push 代替 1.x 的 长轮询。
流程:
- 客户端建立 gRPC stream
- 服务端监听配置变更
- 有变更即时推送到客户端
- 客户端刷新配置
| 元素 | 作用 |
|---|---|
| DataId | 一个具体配置文件名 |
| Group | 业务维度隔离(比如 order-service) |
| Namespace | 环境隔离(dev/test/prod) |
不会,只要 Group 或 Namespace 不同。
Nacos 集群需要 3 个以上节点。
核心:
- 使用 Distro 协议 处理临时实例
- 使用 Raft 处理持久化数据
- 数据持久化在 MySQL
大多数写请求全部写入 MySQL,再同步到集群其他节点。
会 脑裂。Nacos 需要 >=3 节点才能保证一致性。
因为:
- 配置中心需要持久化
- 持久实例需要存储
- 集群同步需要统一的存储
- 节点互相不认识
- 服务注册不一致
- 客户端看到的节点不一致
- 节点互相健康检查失败
使用依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置:
spring:
cloud:
nacos:
server-addr: nacos:8848
让 Bean 支持动态刷新。
- 无 @RefreshScope -> 修改配置无法刷新
- 有 @RefreshScope -> 自动更新
原因:
- @RefreshScope 未加
- gRPC 通道断开
- 客户端使用了单节点而不是 LB
- YAML 格式错误
- MySQL 写入慢(最主要)
- JVM GC 导致卡顿
- 配置推送过多
- 同时监听配置的客户端太多
- 调整 JVM:-Xms4g -Xmx4g
- MySQL buffer pool 调大
- 为 config_info 加索引
- 使用 namespace 分环境
- 服务拆 group
- 扩容 Nacos 节点
- 注册中心(临时实例)-> AP
- 配置中心(持久化)-> CP
Nacos 同时满足 AP 和 CP。
七、故障排查类
检查:
- gRPC 端口 9848
- Nacos server-addr 配置是否写了 LB
- 节点间 7848 是否互通
- 查看节点状态 /nacos/v1/ns/operator/servers
- 查看 naming-server.log
排查:
- telnet 9848
- YAML 格式
- @RefreshScope
- DataId / Namespace 是否正确
- config-server.log 是否报错
原因:
- 7848 未打通
- cluster.conf 配错
- Docker/K8S NAT 问题
- 时钟不同步
通过 Auth + Token:
- 用户管理
- 角色管理
- 权限控制(namespace 级别)
只需要备份 MySQL:
mysqldump nacos > nacos.sql
配置中心所有数据都在 DB 中。
因为:
- HTTP 长轮询耗资源
- 推送需要实时性
- 节点间同步需要高性能
- 支持长连接
- 统一通信协议
- 临时实例 -> Distro 协议(AP)
- 持久化数据 -> Raft(CP)
- MySQL 统一存储
- 节点间定时全同步
- 客户端分批推送
- 压缩推送数据
- gRPC 复用连接
- 拉模式 + 推模式结合
- 大规模情况下需要 多集群分区