nacos注册源码
2020-12-03 09:52:31 3 举报
登录查看完整内容
Nacos注册源码
作者其他创作
大纲/内容
AbstractAutoServiceRegistration
run
tasks.take();
新的注册实例更新到注册表
阿里自己实现的AP模式的Distro协议
BeatTask
健康检查相关
线程池立即开启线程任务更新最后心跳时间
持久化实例
将临时的注册实例更新到Cluster的ephemerallnstances属性上去,服务发现查找临时实例最终从内存里找到的就是这个属性
@Bean
NacosDiscoveryAutoConfiguration
服务注册
执行实例数据批量同步任务
HTTP rest 调用服务端的实例注册接口
queue.offer(key)
service.processClientBeat
InstanceController.register
putServiceAndInit(service)
register()
将新注册实例加入对应服务Service的实例列表中
服务发现
/instance
利用CountDownLatch实现一个简单的raft协议吸入数据的逻辑,必须集群半数以上节点写入成功才会给客户端返回成功
将注册实例更新到内存实结构里面去
HttpClient.asyncHttpPostLarge
双层Map 表结构
调用服务端的服务发现接口
创建内存注册表结构
persistentConsistencyService
/distro/datum
notifier.addTask
DistroConsistencyServiceImpl.init()
UpdateTask
bind(WebServerInitializedEvent event)
nacosAutoServiceRegistration
/raft/datum/commit
nacos-server
serviceRegistry就是NacosServiceRegistry的实例
InstanceController.list
serverProxy.sendBeat
往阻塞队列tasks里放入注册实例数据
NacosRegistration
WebServerInitializedEvent
ephemeralConsistencyService
start()
doSrvIpxt
hostReactor.getServiceInfo()
定时获取服务端最新数据,更新到本地缓存
taskDispatcher.addTask(key)
调用Server的实例同步接口(HttpMethod.put)
NamingService.getAllInstances
异步任务更新到内存注册表
this.serviceRegistry.register(this.getRegistration());
persistentConsistencyService.put
retrySync(syncTask)
阿里自己实现的CP模式的简单Raft协议
注册监听Tomcat启动
updateServiceNow
当前节点是否leader
循环从阻塞队列queue里拿实例数据处理
/instance/beat
往阻塞队列queue里放入注册实例数据
scheduleUpdatelfAbsent
putService(service);
ephemeralInstances = toUpdateInstances;
延时执行的定时任务更新客户端的服务缓存
nacos这个更新注册表内存方法里,为了防止读写并发冲突,大量运用了CopyOnWrite思想,防止并发读写冲突,具体做法就是把内存结构复制一份,操作完最后再替换回真正的注册表内存去Eureka防止读写并发冲突,用的方法时注册表的多级缓存结构,只读缓存,读写缓存,内存注册表,各级缓存之间定时同步,客户端感知的及时性不如nacos
GlobaIExecutor.submitDataSync
如果为空,则调用service接口获取数据
临时化实例
queue.poll
/instance/list
raftStore.write
notifier.run()
从缓存获取实例
if (instance.isEphemeral()) 判断是否是临时实例是才执行 (延时执行的任务)
http rest调用
将service对应的全量实例 instances写入注册表
if(daataSize == partitionConfig.getBatchSyncKeyCount() || (System.currenTimeMillins() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())
this.getRegistration()就是NacosRegistration 的实例
如果实例不存在,重新注册(如服务端重启实例丢失)
NamingService.registerInstance
DistroConsistencyServiceImpl.put
raftProxy.proxyPostLarge(将这个请求转发集群leader写入)
service.init();
如果注册的实例达到一定数量就批量同步给nacos集群中的其他节点或者距离上一次节点同步达到一定时间也会开始批量同步
getPushService().serrviceChanged
instance.setLastBeat(System.currentTimeMillis())
nacos-client
写文件保存到本地
dataStore.put
同步实例信息给集群其他节点
循环从阻塞队列中拿数据处理
GlobaIExecutor.submitTaskDispatch(taskScheduler)
TaskDispatcher.init()
GlobalExcutor.submitDistroNotifyTask(notifier)
同步实例到集群其他机器
线程
集群数据同步的一种方案,异步批量同步
源码入口
否
getServiceInfo()
raftCore.signalPublish
NacosServiceRegistry
keys.add(key)
taskScheduler.run()
InstanceController.beat
发布服务变化事件
spring-cloud-alibaba-nacos-discovery-0.9.0.RELEASE.jarorg.springframework.cloud.alibaba.nacos
继承
0 条评论
回复 删除
下一页