Nacos

一、Nacos 核心概念

  1. 是什么?

Nacos(Dynamic Naming and Configuration Server)是阿里开源的服务发现+配置管理+服务治理平台,核心功能:

  • 服务发现与健康监测:服务注册、心跳机制、DNS 查询
  • 动态配置管理:配置发布、监听、版本管理
  • 动态 DNS:基于权重的路由、地域就近访问
  • 服务元数据管理:支持应用/版本/环境等元数据
  1. 关键特性
    • 双模式:支持 CP(强一致性、如配置管理)和 AP(高可用,如服务发现)
    • 配置实时推送:基于长轮询(减少无效请求)
    • 生态兼容:无缝集成 Spring Cloud、Dubbo、Kubernetes

二、核心架构与原理

  1. 服务注册与发现流程
    • 注册:服务启动时向 Nacos Server 发送注册请求(HTTP/gRPC)
    • 心跳:客户端定期发送心跳(默认5秒),超时(15秒)标记为不健康,30秒后剔除
    • 发现:消费者通过订阅机制获取服务列表,本地缓存+增量更新
  2. 配置管理机制
    • 发布配置:通过控制台/API发布配置,存储于 Derby 或 MySQL
    • 监听配置:客户端长轮询(默认30秒),服务端 Hold 住请求,配置变更立即返回
    • 历史版本:支持配置回滚和版本对比
  3. 一致性协议
    • CP 模式:使用 Raft 协议(配置管理场景)
    • AP 模式:自研 Distro 协议(服务发现场景,最终一致性)

三、重要知识点

  1. Nacos vs Eureka vs Zookeeper?
    • Eureka:AP 设计,适合服务发现,但功能单一
    • Zookeeper:CP 设计,强一致性,但写性能低
    • Nacos:AP/CP 可切换,集成服务发现+配置管理,生态更全面
  2. 长轮询如何实现配置实时推送?
    • 客户端发起查询请求,若配置无变化,服务端 Hold 请求至超时(默认30秒)或期间配置变更立即返回
    • 对比传统轮询:减少无效请求,提升实时性
    • 对比 WebSocket:长轮询服务端实现更简单,但存在30秒最大延迟(非实时配置场景选长轮询即可,实时性要求极高场景考虑 gRPC 流式推送)
  3. Nacos 集群如何保证数据一致性?
    • Distro 模式(AP 模式):每个节点负责部分数据,通过异步复制保证最终一致性。写入时先写本地,再异步复制到其他节点;读取时可能读到旧数据,但通常可接受(服务发现场景对一致性要求不高)。
    • Raft 协议(CP 模式):选举 Leader,多数节点写成功才返回。适用于配置管理——配置错了影响面大,宁可不更新也不能不一致。
  4. Nacos 2.0 升级了哪些内容?
    • 通信层优化:gRPC 替代 HTTP,减少连接数(1.x 每个客户端与 server 维持多个 HTTP 长连接,2.0 全复用为一条 gRPC 连接)
    • 长连接增强:支持服务端主动推送,降低延迟
    • 性能提升:支撑百万级服务实例
  5. 如何实现配置灰度发布?
    • 通过 Data ID 或 Group 分组,结合 Spring Cloud 的 @RefreshScope 或监听 ConfigChangeEvent 实现部分实例更新
    • 更优雅的方式:使用 Nacos 的 Beta 发布功能——指定目标 IP 列表,只有命中 IP 的客户端拉取到灰度配置。验证无误后再全量发布。

四、实战场景与排查思路

  1. 服务注册失败常见原因
    • 网络不通:检查 Nacos Server 地址和端口(telnet 或 nc 测试连通性)
    • 版本冲突:Spring Cloud Alibaba 与 Nacos 版本不兼容 → 参考官方版本对应表
    • 命名空间/Group 配置错误:客户端 namespacegroup 须与服务端一致,命名空间为空时默认使用 public
    • 防火墙/安全组拦截:gRPC 端口(9848/9849)需额外开放
  2. 配置不生效排查步骤
    • 检查控制台配置是否发布成功(Data ID、Group、命名空间与客户端代码匹配)
    • 检查 @RefreshScope 是否加在正确的位置——标注在 @Configuration 类上可能导致整个类重新创建,注意副作用
    • 查看日志:com.alibaba.nacos.client.config.listener 包日志是否有监听异常
    • 长轮询超时确认:查看请求日志中 HTTP 状态码是否为 200(非 304 表示配置变更)
  3. Nacos 集群部署注意事项
    • 至少 3 个节点形成 Raft 选举(节点数建议奇数,避免脑裂)
    • 使用 MySQL 作为外部存储(Derby 仅适合单机测试——集群模式下不使用 MySQL 会导致各节点数据不一致)
    • 所有节点配置文件中的 cluster.conf 必须包含所有节点地址
    • 通过 Nginx 做负载均衡时,gRPC 长连接需要配置 upstreamip_hash 或使用 nginx-stream 模块

五、高级话题

  1. Nacos-Sync 应用
    • 跨注册中心同步(如 Kubernetes Service 到 Nacos、Eureka 迁移到 Nacos)
    • 本质是事件监听+双向同步,注意循环同步问题(A→B→A 死循环),Nacos-Sync 通过记录同步来源避免
  2. 安全控制
    • 开启鉴权:nacos.core.auth.enabled=true,配置自定义用户角色
    • 重要:Nacos 2.2.3 之前默认鉴权不开启,且密钥为硬编码,务必修改 nacos.core.auth.plugin.nacos.token.secret.key
  3. 双活部署
    • 多数据中心通过 Nacos-Sync 同步数据,结合 DNS 实现流量切换
    • 注意:跨地域同步存在网络延迟,配置变更可能在数秒后才能传播到异地——不要依赖 Nacos 跨地域强一致
使用 Hugo 构建
主题 StackJimmy 设计