Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Nacos FAQ

内容:基础、注册中心、配置中心、集群、高可用、原理、性能、运维、Spring Cloud Alibaba 集成等。

一、基础概念类

1. 什么是 Nacos?能做什么?

Nacos 是阿里开源的 服务注册中心 + 配置中心,两个核心能力:

  1. Naming(注册中心)

    • 服务注册/发现
    • 健康检查
    • 负载均衡
  2. Config(配置中心)

    • 配置热更新
    • 配置监听
    • 多环境隔离
    • Gray 配置(灰度)

核心目标是帮助微服务治理。

2 Nacos 和 Eureka 的区别?

特性 Nacos Eureka
注册中心支持 ✅(强)
配置中心 ✅(强)
集群一致性协议 Distro + Raft AP
健康检查 服务端主动检查 客户端心跳
gRPC 通信 ✅(强)
动态配置
权限控制

Nacos 是“注册中心 + 配置中心”,功能远强于 Eureka。

3 Nacos 的模式有哪些?

  • Standalone(单机模式)
  • Cluster(集群模式)
  • Embedded(嵌入式,使用 Derby 数据库)

生产必须用 集群 + MySQL

二、注册中心(Naming)类

4. Nacos 注册中心如何实现服务注册?

客户端通过 gRPC(9848)向 Nacos 发送:

  • 实例 IP
  • Port
  • Weight
  • Ephemeral(临时实例)
  • Metadata

Nacos 接收后写入内存并持久化到 MySQL(非临时)。

5. 临时实例(Ephemeral) vs 非临时实例?

类型 临时实例 非临时实例
是否依赖心跳
心跳丢失是否下线 不会
是否持久化到 DB
多用于 微服务 物理设备/IoT

6. Nacos 如何做健康检查?

Nacos 支持两种:

  1. 客户端心跳(默认)
  2. 服务端主动探测(HTTP/TCP 检查)–可选

临时实例依赖心跳。

7. Nacos 服务注册为何使用 gRPC?

  1. 推送实时性高
  2. 集群同步快
  3. 双向流通信,效率高
  4. 替代了旧的 HTTP 长轮询

8. 为什么会出现服务上下线频繁?

常见原因:

  • gRPC(9848)被防火墙拦截
  • 客户端心跳丢包
  • K8S LivenessProbe 太严格
  • 不同节点数据不同步

三、配置中心(Config)类

9. Nacos 配置推送原理?

Nacos 2.x 使用 gRPC push 代替 1.x 的 长轮询。

流程:

  1. 客户端建立 gRPC stream
  2. 服务端监听配置变更
  3. 有变更即时推送到客户端
  4. 客户端刷新配置

10. DataId / Group / Namespace 的区别?

元素 作用
DataId 一个具体配置文件名
Group 业务维度隔离(比如 order-service)
Namespace 环境隔离(dev/test/prod)

11. 两个服务 DataId 相同会冲突吗?

不会,只要 Group 或 Namespace 不同。

四、集群与存储类

12. Nacos 集群原理?如何实现高可用?

Nacos 集群需要 3 个以上节点。

核心:

  • 使用 Distro 协议 处理临时实例
  • 使用 Raft 处理持久化数据
  • 数据持久化在 MySQL

大多数写请求全部写入 MySQL,再同步到集群其他节点。

13. 为什么 Nacos 不能使用 2 节点集群?

脑裂。Nacos 需要 >=3 节点才能保证一致性。

14. 为什么 Nacos 必须使用 MySQL?

因为:

  • 配置中心需要持久化
  • 持久实例需要存储
  • 集群同步需要统一的存储

15. cluster.conf 配错会怎样?

  • 节点互相不认识
  • 服务注册不一致
  • 客户端看到的节点不一致
  • 节点互相健康检查失败

五、Nacos 与 Spring Cloud Alibaba

16. Spring Cloud Alibaba 如何与 Nacos 集成?

使用依赖:

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

配置:

spring:
  cloud:
    nacos:
      server-addr: nacos:8848

17. @RefreshScope 有什么作用?

让 Bean 支持动态刷新。

  • 无 @RefreshScope -> 修改配置无法刷新
  • 有 @RefreshScope -> 自动更新

18. 为什么客户端配置不刷新?

原因:

  • @RefreshScope 未加
  • gRPC 通道断开
  • 客户端使用了单节点而不是 LB
  • YAML 格式错误

六、性能优化与架构类

19. Nacos 性能瓶颈是什么?

  1. MySQL 写入慢(最主要)
  2. JVM GC 导致卡顿
  3. 配置推送过多
  4. 同时监听配置的客户端太多

20. 如何提升 Nacos 集群性能?

  • 调整 JVM:-Xms4g -Xmx4g
  • MySQL buffer pool 调大
  • 为 config_info 加索引
  • 使用 namespace 分环境
  • 服务拆 group
  • 扩容 Nacos 节点

21. Nacos 如何保证 AP/CP 切换?

  • 注册中心(临时实例)-> AP
  • 配置中心(持久化)-> CP

Nacos 同时满足 AP 和 CP。

七、故障排查类

22. 服务注册失败怎么办?

检查:

  1. gRPC 端口 9848
  2. Nacos server-addr 配置是否写了 LB
  3. 节点间 7848 是否互通
  4. 查看节点状态 /nacos/v1/ns/operator/servers
  5. 查看 naming-server.log

23. 配置不刷新怎么办?

排查:

  1. telnet 9848
  2. YAML 格式
  3. @RefreshScope
  4. DataId / Namespace 是否正确
  5. config-server.log 是否报错

24. 为什么 Nacos 节点状态显示 DOWN?

原因:

  • 7848 未打通
  • cluster.conf 配错
  • Docker/K8S NAT 问题
  • 时钟不同步

八、安全与运维类

25. Nacos 权限控制如何做?

通过 Auth + Token:

  • 用户管理
  • 角色管理
  • 权限控制(namespace 级别)

26. 如何备份 Nacos?

只需要备份 MySQL:

mysqldump nacos > nacos.sql

配置中心所有数据都在 DB 中。

九 进阶

27. Nacos 为什么在 2.x 引入 gRPC?

因为:

  1. HTTP 长轮询耗资源
  2. 推送需要实时性
  3. 节点间同步需要高性能
  4. 支持长连接
  5. 统一通信协议

28. Nacos 是如何保证服务信息最终一致的?

  • 临时实例 -> Distro 协议(AP)
  • 持久化数据 -> Raft(CP)
  • MySQL 统一存储
  • 节点间定时全同步

29. Nacos 如何处理大规模客户端 (>10 万实例)?

  1. 客户端分批推送
  2. 压缩推送数据
  3. gRPC 复用连接
  4. 拉模式 + 推模式结合
  5. 大规模情况下需要 多集群分区