Conan
Conan
发布于 2026-06-14 / 0 阅读
0
0

Nacos配置变更及时响应

nacos的客户端和服务端的配置变更能及时变更的底层原理是:

  1. 客户端会循环向服务端发送http请求,每个http请求30s,

    1. 30s中间有配置变更会及时返回,返回对应的配置的data+groupId,

    2. 然后客户端拿到这个变更id,再发送另外一个请求去获取最新的配置,

    3. 然后再讲最新的配置以key=dataId+groupId,value=对应配置文件的md5去发送请求到服务端,

  2. 服务端拿到这个请求后,先开启异步模式,startAsync,此时tomcat的http链接被释放,但是请求暂时没有响应,

    1. 然后将请求响应以及这次参数封住成为一个对象,放到一个set的队列里面,

    2. 并且给这个对象加到一个现成的定时任务的线程池里面,定时大概是29.5 秒,

  3. 服务端会有个一个对配置变更的发布订阅模式,如果有配置变更那么就发布这个事件,

    1. 此时订阅事件的方法就会被触发,这个拿到set的队列的所有对象,

    2. 然后启动一个线程,去循环那对象中的配置md5的参数,根据发生变更的配置的data+groupId 的key去找value,然后比对md5,,

      1. 如果变更就从队列中rm掉这个对象,并且讲这个对象的线程池的任务取消掉,

        1. 会存在定时任务和事件监听拿到同一个对象的情况,所以对象会有一个Atomic的Boolean的状态,这个状态代表配置是否发送变更;

        2. 在rm之前会使用CAS乐观锁比对的形式去边变更这个状态的值,变更成功才会rm;

        3. 保证这个对象只能被一个人进行最后的逻辑处理;不管是定时任务返回空值,还是事件返回对应配置变更的dataId+groupId响应。

      2. 然后拿到这个对象的resp,再将data+group写入响应里面返回。

  4. 如果期间没有配置变更,到事件后,也是rm队列然后写入一个空的响应给客户端;


评论