Nacos基本架构及原理

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秒还会主动去拉一次,客户端拉取和服务器推送是互补的。

也可以这样概括:

  1. 服务的提供方会向nacos server注册信息,这个注册信息会包装成Instance,放到ServiceInfo中
  2. 服务的提供方每隔5s会向nacos server发送心跳,如果server端在15秒内未收到Client心跳,则会标记为不健康的状态;若在30s内收到Client心跳,则恢复为健康状态,否则从Server的内存中清除该实例。(不健康的实例,server会自动清除)
  3. 服务消费者在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Server本地,同时在Nacos Server本地开启一个定时任务,定时拉取服务端最新的注册表信息更新到本地缓存中

最后:

Nacos通过分层架构 (客户端、接入层、核心服务、一致性协议)实现了高可扩展的服务注册与发现平台。其核心原理围绕异步处理注册心跳健康检查双模式变更通知展开,在保证高性能的同时,通过客户端缓存和定期拉取确保了数据的最终一致性。多数据中心支持和灵活的一致性协议,使其能够适应从单机到大规模分布式集群的各种部署需求,成为云原生微服务架构中的关键基础设施。

相关推荐
菜根Sec3 小时前
业务架构师认证CBA简介
大数据·微服务·架构
汀沿河3 小时前
4 human in loop中间件
人工智能·中间件
断春风3 小时前
深入了解 Java 日志框架:SLF4J 和 Logback
java·架构·logback
黄焖鸡能干四碗3 小时前
企业数据架构、应用架构、技术架构设计方案(PPT文件)
大数据·运维·数据库·安全·架构·需求分析
lclcooky4 小时前
SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现
spring cloud·微服务·json
九鼎创展科技4 小时前
发科MT8791(Genio 520)处理器技术详解 及同平台芯片横向对比与最优选型
人工智能·科技·嵌入式硬件·架构·边缘计算
linan1014 小时前
ROS 2 DDS 总体设计详解:架构、理念与核心机制
架构
yuweiade4 小时前
SpringGateway网关(Spring Gateway是Spring自己编写的,也是SpringCloud中的组件)
spring·spring cloud·gateway
yoyo_zzm4 小时前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel