nacos注册源码
2020-11-15 18:15:38
登录查看完整内容
nacos注册源码
举报
猜你喜欢
大纲/内容
queue.offer(key)
taskDispatcher.addTask(key)
NacosDiscoveryAutoConfiguration
taskScheduler.run()
WebServerInitializedEvent
利用CountDownLatch实现了一个简单的raft协议写入数数据的逻辑,必须集群半数以上节点写入成功才会给客户端返回成功
阿里自己实现的CP模式的简单Raft协议
将注册实例信息更新到注册表内存结构里去
TaskDispatcher.init()
GlobalExecutor.submitTaskDispatch(taskScheduler)
将service对应的全量实例instances写入内存注册表
/raft/datum/commit
@Bean
/distro/datum
往阻塞队列tasks里放入注册实例数据
NacosRegistration
start
GlobalExecutor.submitDistroNotifyTask(notifier)
AbstractAutoServiceRegistration
创建内存注册表结构
继承
同步写实例数据到文件
addInstance
notifier.run()
InstanceController.register
beatReactor.addBeatInfo
将临时的注册实例更新到了cluster的ephemeralInstances属性上去,服务发现查找临时实例最终从内存里找到的就是这个属性
GlobalExecutor.submitDataSync
双层map结构
if(instance.isEphemeral()){添加一个延时执行的定时心跳任务BeatTask}
putServiceAndInit(service)
serverProxy.registerService
consistencyService.put()
ephemeralInstances = toUpdateInstances
putService(service)
persistentConsistencyService
DistropConsistencyServieImpl.init()
serviceRegistry.register(this.getRegistration())
如果是临时化实例
源码精髓:nacos这个更新注册表内存方法里,为了防止读写并发冲突,大量的运用了CopyOnWrite思想防止并发读写冲突,具体做法就是把原内存结构复制一份,操作完最后再替换回真正的注册表内存里去。Eureka防止读写并发冲突,用的方法是注册表的多级缓存结构,只读缓存,读写缓存,内存注册表,各级缓存之间定时同步,客户端感知的及时性不如nacos
循环从阻塞队列task里拿实例数据处理
DelegateConsistencyServiceImpl.put
执行实例数据批量同步任务
源码精髓:很多开源框架为了提升操作性能,会大量使用这种异步任务及内存队列操作,这些操作本身并不需要写入之后立即成功,用这种方式对提升操作性能有很大帮助
本节点是否leader
如果是持久化实例
register
NacosAutoServiceRegistration
mapConsistencyService(key)
sprint-cloud-starter-alibaba-nacos-discovery.jar里面的sprint.factories的NacosDiscoveryAutoConfiguration
源码精髓:集群数据同步的一种方案,异步批量同步
raftStore.write(datum)
阿里自己实现的AP模式的Distro协议
同步实例信息到nacos server集群其他节点
循环从阻塞队列queue里拿实例数据处理
serviceManager.registerInstance
/instance
发布服务变化事件
将新注册实例加入对应服务service的实例列表里去
this.getRegistration()就是NacosRegistration的实例
源码入口
retrySync(syncTask)
service.init()
NamingService.registerInstance
往阻塞队列queue里放入注册实例数据
nacos-server
如果注册的实例达到一定数量就批量同步给nacos集群中的其他节点,或者距离上一次节点同步达到一定时间也会开始批量同步
同步实例信息给集群其他节点
将注册实例更新到内存注册表
HttpClient.asyncHttpPostLarge
bind(WebServerInitializedEvent)
keys.add(key)
queue.poll
tasks.take()
serviceRegistry就是NacosServiceRegistry的实例
nacos-client
NacosServiceRegistry
raftProxy.proxyPostLarge(将注册请求转发到集群的leader节点)
createEmptyService
调用服务端的实例注册接口(HttpMethod.POST)
健康检查相关
ephemeralConsistencyService
getPushService().serviceChanged(this)
调用server的实例同步接口(HttpMethod.PUT)
异步任务更新内存注册表
if(dataSize==partitionConfig.getBatchSyncKeyCount()||(System.currentTimeMillins()-lastDispatchTime)>partitionConfig.getTaskDispatchPeriod())
注解监听tomcat启动
0 条评论
回复 删除
下一页
职业:硕士
作者其他创作:
Spring IOC源码流程
179 2021-10-13
SpringMVC源码流程图-@Controller注解
258 2021-06-23
nacos服务发现
544 2020-11-16
nacos健康检查
723 2020-11-14
nacos心跳机制
917 2020-11-14
nacos注册源码
621 2020-11-15