nacos的客户端和服务端的配置变更能及时变更的底层原理是:
客户端会循环向服务端发送http请求,每个http请求30s,
30s中间有配置变更会及时返回,返回对应的配置的data+groupId,
然后客户端拿到这个变更id,再发送另外一个请求去获取最新的配置,
然后再讲最新的配置以key=dataId+groupId,value=对应配置文件的md5去发送请求到服务端,
服务端拿到这个请求后,先开启异步模式,startAsync,此时tomcat的http链接被释放,但是请求暂时没有响应,
然后将请求响应以及这次参数封住成为一个对象,放到一个set的队列里面,
并且给这个对象加到一个现成的定时任务的线程池里面,定时大概是29.5 秒,
服务端会有个一个对配置变更的发布订阅模式,如果有配置变更那么就发布这个事件,
此时订阅事件的方法就会被触发,这个拿到set的队列的所有对象,
然后启动一个线程,去循环那对象中的配置md5的参数,根据发生变更的配置的data+groupId 的key去找value,然后比对md5,,
如果变更就从队列中rm掉这个对象,并且讲这个对象的线程池的任务取消掉,
会存在定时任务和事件监听拿到同一个对象的情况,所以对象会有一个Atomic的Boolean的状态,这个状态代表配置是否发送变更;
在rm之前会使用CAS乐观锁比对的形式去边变更这个状态的值,变更成功才会rm;
保证这个对象只能被一个人进行最后的逻辑处理;不管是定时任务返回空值,还是事件返回对应配置变更的dataId+groupId响应。
然后拿到这个对象的resp,再将data+group写入响应里面返回。
如果期间没有配置变更,到事件后,也是rm队列然后写入一个空的响应给客户端;