一、同步配置(ConfigService)
Nacos客户端里负责配置同步的是NacosConfigService
,它里面有一个ClientWorker
。在nacos1.4里是有个executor
线程池去跑checkConfigInfo()
方法来长轮询拉取配置。nacos2.0,ClientWorker
里面有个ConfigRpcTransportClient
的agent
,他里面有个executor
线程池,执行executeConfigListen()
方法拉取配置。长轮询拉取配置的过程:
在一个死循环里,发送请求给nacos服务端去获取发生了变化的配置的changedGroupKeys
(即namespace,groupid,dataid信息),如果获取到了,在用这些key去获取具体的配置。
这个请求发送到nacos服务端时,nacos服务端根据请求里的想要监听的配置计算一下MD5,跟服务端的数据对比一下,如果不一样,说明发生了变化,那就返回。否则创建一个任务(里面包含请求数据)放到一个集合allSubs
里,然后通过定时器执行此任务,30s(isFixedPolling的话29.5s)后执行,将此任务移出allSubs
,如果配置发生了变化,那就响应相应的key。这是服务端处理请求的逻辑,而在这30s之内,当服务端配置发生变化时,会发布一个事件,事件监听器在收到事件后,遍历allSubs
,判断里面的请求的keys是否包含当前变化的key,如果有那就响应。
二、同步服务(NamingService)
- 客户端发起事件订阅后,HostReactor中有UpdateTask线程,每10s发送一次Pull请求,获得服务端最新的地址列表
- 服务端与服务提供者的实例之间维持了心跳检测,一旦服务提供者出现异常,则会发送一个Push消息给Nacos客户端,也就是服务消费者
- 服务消费者收到请求后,使用HostReactor的processServiceJSON方法解析消息,更新本地服务地址列表。
网友评论