nacos流程图
2020-06-18 18:21:51 5 举报
nacos源码流程执行
作者其他创作
大纲/内容
createEmptyService
retrySync(syncTask)
GlobalExecutor.submitDataSync
consistencyService.onPut(
new UpdateTask()
实现ApplicationListene类的方法,Spring容器启动会自动调用该监听方法,做什么的????
返回就是注册时写入的实例属性
service.init()
如果实例30秒没有收到心跳,则删除实例
/distro/datum
notifier.run()
调用
服务注册
将临时的注册信息更新到cluster的ephemeralInstances属性上去,服务最终发现查找临时实例最终从内存里找到的就是这个属性
start()
/instance
doSrvIPXT
keys.add(key)
NacosAutoServiceRegistration
@bean
BeatTask
如果注册实例数量达到一定数量就批量同步,同步nacos其他节点点。或者距离上一次同步时间达到一定时间也批量同步
持久化实例
NacosDiscoveryAutoConfiguration.java
HealthCheckReactor.scheduleCheck
调用Server服务发现接口HttpMethod.GET方法
1.将实例更新内存注册表??
集群同步的一种方案,值得学习
httpclient调用Server端注册实例HttpMenthod.Post方法
getRegistration()就是NacosRegistration的实例对象
InstanceController.list
请求
serviceManager.registerInstance
bing(event)
延时定时任务,更新客户端服务缓存信息
继承
Server
ApplicationListener
服务发现
往循环队列放入tasks注册实例,BlockingQueue
Spring后置处理器,搞一些小动作
NacosNamingService.getAllInstances
获取客户端实例的缓存信息
DelegateConsistencyServiceImpl.put()
NamingProxy.syncData
putService
如果15秒没有收到心跳则设置健康状态为fasle
httpclient调用Server端,HttpMethod.PUT请求
TaskDispatcher.init()
执行实例批量同步任务
同步不成功,重试
serviceManager.removeInstance
往阻塞队列放注册实例
getServiceInfo
判断走哪个注册实例,临时?持久?
AbstractAutoServiceRegistration
三个类实现consistencyService.put方法,why什么是Delegate先调用?
beatReactor.addBeatInfo()
DistroConsistencyServiceImpl.init()
最后会更新lastRefTime时间
substractIpAddresses
定时获取服务端缓存信息并更新到本地任务
TaskScheduler.run()
nacos更新注册表内存的方法里,为了防止读写并发冲突,大量的运用了CopyOnWrite思想防止并发读写冲突,具体做法就是把原内存结构复制一份,操作完最后再合并回真正的注册表内存里。Eureka防止读写并发冲突用的方式注册表的多级缓存结构,只读缓存,内存注册表,各级缓存之间定时同步,客户端感知的及时性不如nacos
循环从阻塞队列拿出注册实例
/instance/list
onApplicationEvent
this.serviceRegistry.register(getRegistration());
register()
入口:spring.factories
立即执行ClientBeatProcessor任务更新客户端心跳时间instance.setLastBeat(System.currentTimeMillis())
putServiceAndInit
如果缓存为空,调用Server接口获取最新的数据
GlobalExecutor.submitTaskDispatch(taskScheduler)
GlobalExecutor.submitDistroNotifyTask(notifier);
hostReactor.getServiceInfo
service.srvIPs
执行定时任务
if (dataSize == partitionConfig.getBatchSyncKeyCount() || (System.currentTimeMillis() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())
如果servie为空创建并初始化服务
EphemeralConsistencyService
HealthCheckReacto.scheduleNow
实现
if(instance.isEphemeral())添加一个new BeatTask(beatInfo)定时任务
persistentInstances,ephemeralInstances
DistroController.datum
serverProxy.sendBeat
ServerProxy.registerService
service.processClientBeatnce
PersistentConsistencyService
InstanceController.beat
queue.offer(key)
临时实例
异步任务操作,这些任务写入之后不会立即操作,有助于提升性能
调用Server的实例注销HttpMenthod.Delete方法
如果实例不存在,放入map
instance.setHealthy(false);
serviceManager.registerInstance
ClientBeatCheckTask
将注册实例更新到注册表内存中
getPushService().serviceChanged(this);
InstanceController.register
deleteIP(instance)
如果实例不存在重新创建,如果网络不通,或者实例被删除等原因
client客户
发布服务变化事件
queue.poll()
初始化处理addTask
/instance/beat
taskDispatcher.addTask(key)
tasks.take()
NacosRegistration
循环队列拿出实例数据处理
ephemeralInstances = toUpdateInstances;
0 条评论
下一页