Nacos配置中心服务端源码
2021-08-18 10:06:03 0 举报
Nacos配置中心服务端源码
作者其他创作
大纲/内容
从存放长轮询连接任务队列中获取变更配置的ClientLongPolling
客户端发起数据监听的接口 处理长轮询连接
MD5Util.compareMd5
clientSub.sendResponse(Arrays.asList(groupKey))
AsyncNotifyService通知集群其它节点同步配置
NotifyCenter
是响应客户端
/v1/configs/listener配置监听接口
创建调度任务 29.5s后执行
changedGroups.size() > 0
获取客户端需要监听的可能发生变化的配置 并计算期MD5值
调用集群其它节点的http接口
queue.offer(event)
ConfigExecutor.executeLongPolling(new DataChangeTask
将ClientLongPolling放入队列
sendResponse(null)
onEvent
iter.remove()
处理长轮询连接
@ServiceLongPollingService
发布一个事件ConfigDataChangeEvent
触发监听器事件的回调方法
/v1/cs/communication/dataChange
如果发生变化则直接返回给客户端
inner.doPollingConfig
ConfigChangePublisher.notifyConfigChange
是定时任务将在30秒后开始执行
allSubs = new ConcurrentLinkedQueue初始化存放客户端长轮询连接任务的 阻塞队列
触发回调
ConfigController.publishConfig
persistService.insertOrUpdate
isFixedPolling()
先做持久化保存到mysql
和服务端的数据进行MD5对比
receiveEvent(event)
ConfigExecutor.executeAsyncNotify(new AsyncTask
clientMd5Map = MD5Util.getClientMd5Map(probeModify)
将自身从队列中移除
否 默认29.5秒后开始执行
ConfigExecutor.executeLongPollingnew ClientLongPolling执行长连接任务
ConcurrentHashSet放入集合
publish(Event event)
循环从队列中获取事件
先移除
获取服务端中保存的对应客户端请求的groupKeys判断是否变更
openEventHandler
ConfigExecutor.scheduleLongPolling
LongPollingService.addLongPollingClient
ClientLongPolling.run
nacos控制台
通知订阅者
直接和当前配置做比较 返回有变更的配置给客户端
for (; ; )queue.take()
publisher.addSubscriber(consumer
LongPollingService
allSubs.remove(ClientLongPolling.this)
回调方法
allSubs队列该队列中维持的是所有客户端的请求任务找到与当前发生变更的配置项的groupKey相等的ClientLongPolling任务
NotifyCenter.publishEvent(event)
先判断客户端冬请求的header中是否设置长轮询
sendResponse(changedGroups)
start启动线程
遍历订阅者结合
Servlet 3.0的异步处理支持特性,使用AsyncContext的时候,对于客户端来说,他们是同步在等待服务端的响应结果,但是对于服务器端来说,处理此请求的线程并没有卡在那里等待,则是把当前的处理转为线程池处理了,当线程池处理完请求后才响应给客户端。它的优点是在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线~程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度
DataChangeTask.run
否短连接
AsyncContext asyncContext = req.startAsync()
NotifyCenter.registerSubscriber
JVM加载类时执行static静态代码块初始化事件发布器
是处理长轮询
获取客户端的请求超时时间 默认30s,服务端会提前500ms返回响应,为了避免客户端超时
isSupportLongPolling(request)
DefaultPublisher
响应空结果
把事件放入阻塞队列
post请求 修改配置
allSubs.add(this)
交给线程池执行
构造方法初始化
将发生变更的groupKey通过该ClientLongPolling写入到响应对象中即完成一次数据变更的推送操作
注册订阅者
判断是否为 混合连接
无变化
0 条评论
下一页