Nacos(Dynamic Naming and Configuration Service)是一个易于构建云原生应用的动态服务发现、配置和管理平台。其架构设计遵循高可用、高性能、最终一致性原则,通过分层模块化和异步处理机制,支持海量服务注册与发现。
一、整体架构分层
Nacos系统从逻辑上可以分为客户端组件 、接入层 、核心服务层 和一致性协议层,并支持多数据中心集群部署。

集群
一致性协议
核心服务层
接入层
客户端
Provider APP
Nacos Client/Sidecar
Consumer APP
Nacos Client/Sidecar
Name Server
DNS/VIP/Address Server
OpenAPI
HTTP/DNS/UDP/TLS
Config Service
Naming Service
Nacos Core
Consistency Protocol
Raft/Sync/Renew/RDBMS Based
Multi-Datacenter Nacos Cluster
各模块职责
- Nacos Client/Sidecar:嵌入在服务提供者和消费者中的客户端,负责与服务端通信(注册、心跳、服务订阅、配置获取)。
- Name Server:提供域名解析、VIP(虚拟IP)或地址服务器,用于客户端发现Nacos Server集群地址,实现负载均衡。
- OpenAPI:统一的接入层接口,支持HTTP、DNS、UDP、TLS等多种协议,方便不同语言和场景的集成。
- Config Service:配置管理服务,处理配置的发布、获取、监听等。
- Naming Service:服务发现核心服务,处理服务实例的注册、注销、查询、健康检查。
- Nacos Core:核心基础模块,提供事件驱动、任务调度、缓存管理等通用能力。
- Consistency Protocol:一致性协议层,支持基于Raft的强一致性(如服务元数据)和基于异步同步的最终一致性(如健康状态),并支持多种存储后端(如RDBMS)。
- Multi-Datacenter Nacos Cluster:多数据中心集群部署,实现跨地域的高可用和容灾。
二、核心工作原理
2.1 服务注册流程
当服务提供方启动时,通过Nacos Client向Nacos Server发起注册请求,流程如下:
注册表存储 注册线程池 阻塞队列 Nacos Server Nacos Client 服务提供者 注册表存储 注册线程池 阻塞队列 Nacos Server Nacos Client 服务提供者 启动,准备注册 发送注册请求(Instance) 将请求放入阻塞队列 立即响应成功 异步取出任务 执行注册(写入内存/持久化) 完成 处理完毕
关键设计:
- 请求接收与处理分离:通过阻塞队列和专用注册线程池,避免高并发下直接写注册表导致锁竞争,提升吞吐量。
- 异步写入:主线程快速响应客户端,后台线程保证数据最终一致。
2.2 心跳机制与健康检查
服务提供者注册成功后,需定期发送心跳以维持健康状态。
每5秒发送心跳
否
是
是
否
服务提供者
Nacos Server
15秒内收到心跳?
标记实例为不健康
更新最后心跳时间,保持健康
30秒内是否恢复心跳?
重新标记为健康
从注册表删除实例
触发服务变更通知
健康状态流转:
- 健康:实例正常提供服务,心跳正常。
- 不健康:15秒未收到心跳,但实例仍保留在注册表中,消费者可能通过保护阈值等机制继续调用(避免全部剔除)。
- 移除:30秒内仍未收到心跳,则彻底删除实例,释放资源。
2.3 服务发现与本地缓存
服务消费者通过Nacos Client获取服务提供者列表,并缓存到本地,同时定时更新。
Nacos Server Nacos Client 服务消费者 Nacos Server Nacos Client 服务消费者 loop [定时任务(每10秒)] 首次获取服务列表 发送查询请求 返回实例列表 缓存到本地 拉取最新列表 返回变更或全量列表 更新本地缓存
2.4 服务变更通知机制
当服务实例发生变化(注册、下线、健康状态变更)时,Nacos Server需要通知所有订阅该服务的消费者。
客户端
服务端
成功
若UDP失败或未及时收到
服务实例变更
UDP推送变更
记录变更事件
UDP接收器
更新本地缓存
定时拉取任务
每10秒
双模式结合:
- UDP推送:Server主动通过UDP向客户端发送变更数据。UDP无需建立连接,开销小,适合广播场景。若网络丢包,则推送失败(不重试)。
- 客户端定期拉取:作为补偿,客户端每10秒主动拉取一次全量或增量数据,保证最终一致性。
设计意图:在消费者远多于提供者的场景下,避免Server与海量消费者建立TCP长连接带来的资源消耗,同时利用UDP的实时性和客户端拉取的可靠性,实现高效变更通知。
三、关键设计亮点总结
| 设计点 | 描述 | 优势 |
|---|---|---|
| 异步注册处理 | 注册请求放入阻塞队列,由独立线程池处理 | 提高写入吞吐量,避免并发锁竞争 |
| 心跳健康检查 | 基于时间窗口的健康状态判定与自动剔除 | 无需额外探针,实现故障自动转移 |
| UDP推送+客户端拉取 | 实时UDP通知 + 定期轮询补偿 | 兼顾实时性与可靠性,避免TCP长连接开销 |
| 多数据中心支持 | 通过一致性协议实现跨地域集群 | 提供容灾和就近访问能力 |
| 分层模块化 | 开放API、核心服务、一致性协议分离 | 易于扩展和维护,适应不同部署场景 |
四、核心流程整合图
以下流程图综合展示了服务注册、心跳、发现和变更通知的完整交互:
服务消费方
Nacos Server
服务提供方
15秒未收到
30秒未收到
UDP通知
拉取
注册 Instance
每5秒发送心跳
接收注册请求
放入阻塞队列
后台线程写入注册表
更新实例最后时间
心跳超时判断
标记不健康
删除实例
触发变更事件
UDP推送变更
记录变更供拉取
首次发现
拉取全量实例
缓存到本地
定时每10秒拉取
更新缓存
五、总结
用简单的话概括就是:
当服务提供方启动时候,会向nacos发送注册请求,nacos将注册请求放入到一个阻塞队列中,会有一个负责注册的线程池中单独执行注册请求,将处理请求写和注册的操作分离开,提高性能。采用内存队列,避免了并发写的异常。当服务提供方产生变化的时候,nacos会采用服务端udp推送和客户端主动拉取两种模式进行结合,udp协议非常快,不需要保持长连接。在注册中心的场景中服务的消费者往往多余服务的提供者,如果每一次服务更新,nacos要和成千上万的服务消费者去建立Tcp的话性能肯定是不行的。如果UDP通知失败,客户端每10秒还会主动去拉一次,客户端拉取和服务器推送是互补的。
也可以这样概括:
- 服务的提供方会向nacos server注册信息,这个注册信息会包装成Instance,放到ServiceInfo中
- 服务的提供方每隔5s会向nacos server发送心跳,如果server端在15秒内未收到Client心跳,则会标记为不健康的状态;若在30s内收到Client心跳,则恢复为健康状态,否则从Server的内存中清除该实例。(不健康的实例,server会自动清除)
- 服务消费者在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Server本地,同时在Nacos Server本地开启一个定时任务,定时拉取服务端最新的注册表信息更新到本地缓存中
最后:
Nacos通过分层架构 (客户端、接入层、核心服务、一致性协议)实现了高可扩展的服务注册与发现平台。其核心原理围绕异步处理注册 、心跳健康检查 、双模式变更通知展开,在保证高性能的同时,通过客户端缓存和定期拉取确保了数据的最终一致性。多数据中心支持和灵活的一致性协议,使其能够适应从单机到大规模分布式集群的各种部署需求,成为云原生微服务架构中的关键基础设施。