Nacos 注册中心架构原理
候选人小李在面试阿里 P6 时,面试官问:"你们注册中心用的什么?为什么不用 ZooKeeper?"
小李说:"用的 Nacos,因为它是阿里开源的..."面试官追问:"Nacos 2.0 相比 1.0 有什么变化?Distro 协议是怎么保证 AP 的?"
小李支支吾吾。
【面试官心理】 Nacos 是 Spring Cloud Alibaba 的核心组件,但很多候选人只知道"它是注册中心"。能说清楚 Nacos 的 AP + CP 双模式、Distro 协议、Nacos 2.0 的 gRPC 升级的候选人,说明他对注册中心有深入理解。这种候选人在我这里是 P6+ 的加分项。
一、Nacos 概述 🔴
1.1 Nacos 的两大核心能力
Nacos(Naming and Configuration Service)是阿里开源的服务发现和配置管理平台:
1.2 为什么选 Nacos
二、服务注册与发现 🟡
2.1 服务注册流程
核心代码:
2.2 临时实例 vs 持久实例
2.3 服务订阅与变更通知
三、Nacos 2.0 的 gRPC 升级 🟡
3.1 为什么升级
Nacos 1.0 使用 HTTP 长轮询 进行服务变更推送:
HTTP 长轮询的问题:
- 延迟高:最长等待 30 秒才能感知变更
- 资源浪费:每个 Consumer 都要占用一个 HTTP 连接
- 服务端压力大:大量长轮询请求占用线程
3.2 Nacos 2.0 的 gRPC
Nacos 2.0 引入了 gRPC 长连接:
升级对比:
3.3 Nacos 2.0 的连接管理
四、Distro 协议 🟡
4.1 为什么需要 Distro
Nacos 是一个去中心化的注册中心,没有 ZooKeeper 那样的 Leader:
Distro 的设计目标:
- AP 优先:节点间数据最终一致,允许短暂不一致
- 无 Leader:任意节点都可以写入
- 负载分散:写入压力分散到所有节点
4.2 Distro 的数据同步
同步时机:
- 定时同步:每 5 秒同步一次
- 变更同步:数据变更时立即同步到其他节点
- 启动同步:节点启动时全量同步
4.3 ❌ 错误示范
候选人原话:"Nacos 用 Distro 协议保证强一致性。"
问题诊断:
- 完全理解错了 Distro 的设计目标
- Distro 是 AP 协议,不是 CP
- ZooKeeper 才是强一致(CP)
【面试官心理】 Distro 是 Nacos 的核心技术,能说清楚它"最终一致"的特性和"无 Leader"的设计的候选人,说明他对分布式系统有深入理解。
五、配置管理 🟡
5.1 配置变更推送
5.2 配置监听
5.3 配置的命名空间和分组
六、CP + AP 双模式 🟢
6.1 CP 模式(一致性优先)
6.2 AP 模式(可用性优先)
6.3 选型建议
七、生产避坑
7.1 常见翻车点
- 命名空间配置错误:不同环境的命名空间混用
- 心跳间隔不一致:客户端和服务端心跳配置不匹配
- gRPC 端口未开放:Nacos 2.0 需要开放 9848 端口
- 数据量过大:Nacos 单节点数据量建议不超过 100 万
7.2 监控指标
Nacos 2.0 的 gRPC 端口默认是主端口 + 1000(8848 -> 9848)。如果你的 Nacos 部署在 Kubernetes 中,需要同时暴露这两个端口。
Nacos 的 Distro 协议是最终一致,不是强一致。如果你在服务注册后立即调用,可能会发现服务还没同步过来。对于这种场景,可以加一个启动延迟(spring.cloud.nacos.discovery.registerEnabled=false 配合手动注册)。
【面试官心理】 Nacos 是 Spring Cloud Alibaba 生态的核心组件。能说清楚 Nacos 2.0 的 gRPC 升级、Distro 协议、AP + CP 双模式的候选人,说明他对注册中心有深入理解。这种候选人在我这里是 P6+ 的加分项。