Nacos服务注册源码
2021-06-19 14:10:32 78 举报
登录查看完整内容
springCloud alibaba 服务注册中心nacos客户端注册逻辑源码流程图
作者其他创作
大纲/内容
遍历leader节点中记录的所有服务器,然后排除自己
/distro/datum
同步实例数据给集群的其他节点HttpMethod.POST
/raft/datum
bind(event)
beatReactor.addBeatInfo()
更新内存注册表中的服务实例列表
createEmptyService()
serviceManager.getInstance()
/instance/beat 【PUT】
updateIpAddresses()
如果是临时实例数据
listener就是Service对象
源码入口
addInstance()
/instance 【POST】
addProcessor()
raftConsistencyService.onPut()
往阻塞队列BlockingQueue中加入实例注册数据
serverProxy.registerService()
taskDispatcher.addTask(key)
否
调用server端服务实例注册接口HttpMethod.POST
DistroConsistencyServiceImpl.init()
instance.setLastBeat(System.currentTimeMillis())
peers.allServersIncludeMyself()
RaftConsistencyServiceImpl.span style=\"font-size: inherit;\
目前
源码精髓:集群间数据同步的一种方案批量异步同步
dataStore.put(span style=\"font-size: inherit;\
serviceManager.registerInstance()
NacosDiscoveryAutoConfiguration
提交任务
this.serviceRegistry.register(getRegistration())
raftCore.signalPublish()
HealthCheckProcessorDelegate.process(task)
RaftController.onPublish()
遍历当前Service中所有的Cluster执行初始化
@Bean
queue.poll()
ephemeralConsistencyService
notifier.span style=\"font-size: inherit;\
putAll(C)
/instance 【DELETE】
NacosAutoServiceRegistration
BeatReactor
GlobalExecutor.submitTaskDispatch(taskScheduler)
GlobalExecutor.submitDistroNotifyTask(notifier)
NamingProxy.sendBeat(beatInfo)
dataSyncer.span style=\"font-size: inherit;\
onApplicationEvent
NoneHealthCheckProcessor.process()
getRegistration()是 NacosRegistration的实例
延时任务
仅将空的Service放入内存注册表结构
ClientBeatCheckTask
raftProxy.proxyPostLarge()
do Nothing!
putService()
调用Server实例同步接口HttpMethod.PUT
consistencyService.get()
GlobalExecutor.submitDataSync(span style=\"font-size: inherit;\
调用服务端Leader新增持久实例接口HttpMethod.POST
/raft/datum/commit
继承
clusterMap.init()
RaftCore.init()
Notifier.run()
源码精髓:很多开源框架为了提高性能会大量使用这种异步任务操作,这种方式并不需要写入之后立即操作成功,对于系统性能提升有很大帮助。并发操作 -> 单线程队列
healthCheckProcessorMap.get(type)
HttpClient.asyncHttpPostLarge()
addIpAddresses()
executorService.schedule(span style=\"font-size: inherit;\
register()
ephemeralInstances = toUpdateInstances
spring-cloud-alibaba-nacos-discovery.jar里的spring-factories文件中的 EnableAutoConfiguration对应NacosDiscoveryAutoConfiguration
serviceManager.removeInstance()
if (dataSize == partitionConfig.getBatchSyncKeyCount() || (System.currentTimeMillis() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())
keys.add(key)
DelegateConsistencyServiceImpl.put()
consistencyService.span style=\"font-size: inherit;\
更新具体集群Cluster中实例列表
\"add'
consistencyService.onPut()
InstanceController.register()
tasks.take()
立即执行任务更新 instance的最新心跳
putServiceAndInit(Service)
实现类
substractIpAddresses()
HealthCheckReactor.scheduleCheck(HealthCheckTask)
service.processClientBeat()
serviceRegistry是NacosServiceRegistry的实例
利用CountDownLatch实现了一个简单的raft协议写入数据的逻辑,必须集群中半数以上的节点写入成功才会给leader返回成功
No usages
DistroController.onSyncDatum()
1. 将实例信息更新到注册表
如果方法返回的Instance为空,才会执行实例注册方法.因为实例数据是保存在内存中的注册表,如果服务端重新启动,那么内存中的实例数据都会丢失的。 当前check是一种补偿机制
是
该方法调用了两次: 临时型key、持久型key
if (instance.isEphemeral())添加一个延时执行的定时心跳任务
如果是持久实例数据
TaskDispatcher.init()
queue.offer(key)
HealthCheckReactor.scheduleCheck(clientBeatCheckTask)
RaftController.publish()
executor.submit(notifier)
InstanceController.beat(request)
获取service数据存储dataStore中的实例列表
InstanceController.deregister()
开启一个延迟5s执行的定时(5s)心跳检测任务
mapConsistencyService(key)span style=\"font-size: inherit;\
NacosServiceRegistry
mapConsistencyService(key)
执行批量实例同步的定时任务
isLeader()
NacosNamingService.registerInstance()
2. 同步实例数据到集群其他节点
NamingProxy.syncData(span style=\"font-size: inherit;\
AbstractAutoServiceRegistration
\"remove\"
NacosRegistration
service.init()
listener.onChange(span style=\"font-size: inherit;\
实现
deleteIP(instance)
instance.setHealthy(false)
ApplicationListener
reqAPI()
retrySync(syncTask)
调用server端服务实例注销接口HttpMethod.DELETE
healthCheckProcessor.process(this)
0 条评论
回复 删除
下一页