Nacos 配置中心执行流程的详细说明

一、Nacos配置中心执行流程详解

Nacos配置中心是一个强大的分布式配置管理服务,其执行流程涵盖了配置的发布、获取、监听和更新等核心功能。下面我将从多个维度详细介绍Nacos配置中心的完整执行流程


由于提供者 或 消费者集成了Nacos Client(Nacos的客户端),其实也就是提供者或消费者通过Nacos Client(Nacos的客户端)Nacos的服务端发送HTTPS获取Nacos服务端上的配置信息


二、核心架构组件


1、客户端组件

  • ConfigService:配置服务接口,提供获取/发布配置的能力

  • ClientWorker:实际执行配置获取和监听的核心工作类

  • LongPollingRunnable:长轮询任务线程

  • CacheData:缓存配置数据及监听器


2、服务端组件

  • ConfigController:处理配置相关的RESTful请求

  • PersistService:配置持久化服务

  • DumpService:配置转储服务

  • NotifyCenter:事件通知中心


三、配置发布流程


1、核心概念


2、控制台发布配置


i、用户操作

  • 在Nacos控制台选择命名空间、分组

  • 输入Data ID和配置内容

  • 点击发布按钮


ii、Nacos服务端处理控制台发布的请求

  • Nacos服务端处理:

    • 1、校验配置合法性(格式、长度等)

    • 2、持久化到存储层(默认内嵌 Derby,生产建议 MySQL 集群)

    • 3、通过 Raft 协议保证集群一致性(CP 模式)

    • 4、触发监听器,通知订阅该配置的客户端(是指我们的消费者和提供者)

  • 配置存储结构:


四、消费者或提供者获取配置流程


1、初始化阶段

  • 创建ConfigService

    • 初始化ServerHttpAgent处理HTTP请求

    • 创建ClientWorker实例

  • 首次获取配置


2、获取配置详细流程


i、消费者或提供者端发起请求

  • GET请求:/nacos/v1/cs/configs

  • 参数:dataId, group, tenant(namespace)


ii、Nacos服务端处理请求

  • 检查本地缓存

  • 查询数据库(Derby 或 MySQL)获取配置

  • 返回配置内容及MD5值


iii、消费者或提供者端处理响应

  • 校验MD5

  • 缓存到本地文件

  • 初始化CacheData对象

  • 解析配置内容(如 YAML 转 PropertySource)

  • 将配置注入 Spring Environment


3、首次获取流程


五、配置动态刷新

Nacos 作为配置中心,当消费者或提供者去访问Nacos动态获取配置源之后,会缓存到本地内存以及磁盘中。 由于Nacos作为动态配置中心,

意味着后续配置变更之后需要让所有相关的消费者或提供者端感知,并更新本地内存! 那么这个功能是在哪里实现的呢? 以及它是采用什么样的方式来实现配置的更新的呢?


1、长轮询机制(核心)


i、消费者 或 提供者端行为:

  • 启动长轮询任务,定时(默认 30 秒)检查配置变更

  • 携带本地配置的 MD5 和 lastModified 时间戳


ii、Nacos服务端处理:

  • 对比消费者或提供者端 MD5 与 Nacos服务端 MD5

  • 无变更:挂起请求(默认 30 秒),减少空轮询

  • 有变更:立即返回新配置


2、长轮询机制流程图

消费者或提供者端轮询向Nacos服务端发起一个长连接请求,这个长连接请求最多30就会超时,Nacos 服务端收到请求之后,先检查当前配置是否发生了变更,

  • 如果有,则直接返回长连接请求结果

  • 如果没有,则设置一个定时任务,延期 29.5s 执行,并且把当前的长连接请求加入 allSubs 队列,这个时候有两种方式触发该长连接请求结果返回:

    • 1、第一种是在 29.5s 内任意一个时刻,通过 Nacos Dashboard 或者 API 的方式对配置进行了修改,就会触发一个事件机制,监听该事件的任务会遍历 allSubs 队列,在队列中找到该长连接请求,触发请求查询并返回结果,就完成一次 “推送” 操作。

    • 2、第二种是在等待 29.5s 后触发自动检查机制,这个时候不管配置有没有发生变化,都会把结果返回消费者或提供者端


六、高可用设计


1、消费者 或 提供者端容灾

  • 本地缓存:

    • 配置持久化到 ${user.home}/nacos/config 目录

    • Nacos服务端不可用时,使用本地缓存

  • 重试策略:

    • 失败后自动切换其他节点(需配置集群地址)


2、Nacos服务端集群

  • 数据持久化:

    • 默认内嵌 Derby(测试用)

    • 生产建议:外置 MySQL 集群(主从架构)

  • 一致性协议:

    • 配置数据使用 Raft 协议(CP 模式)

    • 保证强一致性

posted @ 2025-04-17 02:13  jock_javaEE  阅读(115)  评论(0)    收藏  举报