一、Nacos 核心概念
- 是什么?
Nacos(Dynamic Naming and Configuration Server)是阿里开源的服务发现+配置管理+服务治理平台,核心功能:
- 服务发现与健康监测:服务注册、心跳机制、DNS 查询
- 动态配置管理:配置发布、监听、版本管理
- 动态 DNS:基于权重的路由、地域就近访问
- 服务元数据管理:支持应用/版本/环境等元数据
- 关键特性
- 双模式:支持 CP(强一致性、如配置管理)和 AP(高可用,如服务发现)
- 配置实时推送:基于长轮询(减少无效请求)
- 生态兼容:无缝集成 Spring Cloud、Dubbo、Kubernetes
二、核心架构与原理
- 服务注册与发现流程
- 注册:服务启动时向 Nacos Server 发送注册请求(HTTP/gRPC)
- 心跳:客户端定期发送心跳(默认5秒),超时(15秒)标记为不健康,30秒后剔除
- 发现:消费者通过订阅机制获取服务列表,本地缓存+增量更新
- 配置管理机制
- 发布配置:通过控制台/API发布配置,存储于 Derby 或 MySQL
- 监听配置:客户端长轮询(默认30秒),服务端 Hold 住请求,配置变更立即返回
- 历史版本:支持配置回滚和版本对比
- 一致性协议
- CP 模式:使用 Raft 协议(配置管理场景)
- AP 模式:自研 Distro 协议(服务发现场景,最终一致性)
三、重要知识点
- Nacos vs Eureka vs Zookeeper?
- Eureka:AP 设计,适合服务发现,但功能单一
- Zookeeper:CP 设计,强一致性,但写性能低
- Nacos:AP/CP 可切换,集成服务发现+配置管理,生态更全面
- 长轮询如何实现配置实时推送?
- 客户端发起查询请求,若配置无变化,服务端 Hold 请求至超时(默认30秒)或期间配置变更立即返回
- 对比传统轮询:减少无效请求,提升实时性
- 对比 WebSocket:长轮询服务端实现更简单,但存在30秒最大延迟(非实时配置场景选长轮询即可,实时性要求极高场景考虑 gRPC 流式推送)
- Nacos 集群如何保证数据一致性?
- Distro 模式(AP 模式):每个节点负责部分数据,通过异步复制保证最终一致性。写入时先写本地,再异步复制到其他节点;读取时可能读到旧数据,但通常可接受(服务发现场景对一致性要求不高)。
- Raft 协议(CP 模式):选举 Leader,多数节点写成功才返回。适用于配置管理——配置错了影响面大,宁可不更新也不能不一致。
- Nacos 2.0 升级了哪些内容?
- 通信层优化:gRPC 替代 HTTP,减少连接数(1.x 每个客户端与 server 维持多个 HTTP 长连接,2.0 全复用为一条 gRPC 连接)
- 长连接增强:支持服务端主动推送,降低延迟
- 性能提升:支撑百万级服务实例
- 如何实现配置灰度发布?
- 通过 Data ID 或 Group 分组,结合 Spring Cloud 的
@RefreshScope或监听ConfigChangeEvent实现部分实例更新 - 更优雅的方式:使用 Nacos 的 Beta 发布功能——指定目标 IP 列表,只有命中 IP 的客户端拉取到灰度配置。验证无误后再全量发布。
- 通过 Data ID 或 Group 分组,结合 Spring Cloud 的
四、实战场景与排查思路
- 服务注册失败常见原因
- 网络不通:检查 Nacos Server 地址和端口(telnet 或 nc 测试连通性)
- 版本冲突:Spring Cloud Alibaba 与 Nacos 版本不兼容 → 参考官方版本对应表
- 命名空间/Group 配置错误:客户端
namespace和group须与服务端一致,命名空间为空时默认使用 public - 防火墙/安全组拦截:gRPC 端口(9848/9849)需额外开放
- 配置不生效排查步骤
- 检查控制台配置是否发布成功(Data ID、Group、命名空间与客户端代码匹配)
- 检查
@RefreshScope是否加在正确的位置——标注在 @Configuration 类上可能导致整个类重新创建,注意副作用 - 查看日志:
com.alibaba.nacos.client.config.listener包日志是否有监听异常 - 长轮询超时确认:查看请求日志中 HTTP 状态码是否为 200(非 304 表示配置变更)
- Nacos 集群部署注意事项
- 至少 3 个节点形成 Raft 选举(节点数建议奇数,避免脑裂)
- 使用 MySQL 作为外部存储(Derby 仅适合单机测试——集群模式下不使用 MySQL 会导致各节点数据不一致)
- 所有节点配置文件中的
cluster.conf必须包含所有节点地址 - 通过 Nginx 做负载均衡时,gRPC 长连接需要配置
upstream为ip_hash或使用nginx-stream模块
五、高级话题
- Nacos-Sync 应用
- 跨注册中心同步(如 Kubernetes Service 到 Nacos、Eureka 迁移到 Nacos)
- 本质是事件监听+双向同步,注意循环同步问题(A→B→A 死循环),Nacos-Sync 通过记录同步来源避免
- 安全控制
- 开启鉴权:
nacos.core.auth.enabled=true,配置自定义用户角色 - 重要:Nacos 2.2.3 之前默认鉴权不开启,且密钥为硬编码,务必修改
nacos.core.auth.plugin.nacos.token.secret.key
- 开启鉴权:
- 双活部署
- 多数据中心通过 Nacos-Sync 同步数据,结合 DNS 实现流量切换
- 注意:跨地域同步存在网络延迟,配置变更可能在数秒后才能传播到异地——不要依赖 Nacos 跨地域强一致