nacos源码分析-(临时实例AP模式)
2021-02-27 16:37:25 3 举报
nacos源码分析-(临时实例AP模式)
作者其他创作
大纲/内容
BeatTask
本节点是否leader
发送服务变化事件
DistroConsistencyServiceImpl.init()
notifier.run()
NacosRegistration
listener就是service的实例,将注册实例信息更新到注册表的内存结构里
实现
循环从阻塞队列tasks中拿实例数据去处理
@Bean
将新注册的实例加入对应的服务service的实例列表中
if (dataSize == partitionConfig.getBatchSyncKeyCount() || (System.currentTimeMillis() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())
deleteIP(instance)
阿里自己实现的CP模式的简单Raft协议
ClientBeatCheckTask
nacos-Server服务端
queue.poll()
raftProxy.proxyPostLarge
putServiceAndInit(service)
GlobalExecutor.submitTaskDispatch(taskScheduler)
GlobalExecutor.submitDistroNotifyTask(notifier);
异步任务更新内存注册表
将临时的注册实例更新到了cluster的ephemeralInstances属性上去, 服务发现查找临时实例,最终从内存里找到的就是这个属性
将service对应的全量实例instances写入内存注册表
extends
namingService.registerInstance
利用CountDownLatch实现了一个简单的raft协议写入数据的逻辑,必须集群半数以上的节点写入成功,才会给客户端返回成功
AbstractAutoServiceRegistration
serverProxy.registerService()
同步实例信息给集群中的其他节点
ApplicationListener
NacosServiceRegistry
taskScheduler.run()
start()
1.将注册实例更新到内存注册表
NacosDiscoveryAutoConfiguration
HttpClient.asyncHttpPostLarge
bind(event)
调用注销实例接口 /nacos/v1/ns/instance
client客户端
创建内存注册表结构
createServiceIfAbsent()
DistroController.onSyncDatum()
调用server的注册实例接口(HttpMethod.POST)
persistentConsistencyService
serverProxy.sendBeat(beatinfo)
调用server的实例注销接口,HttpMethod.DELETE
serviceRegistry.register(this.getRegistration())
否
onApplicationEvent()
InstanceController
getPushService().serviceChanged(this)
服务注册
源码精髓:集群数据同步的一种方案,批量异步同步
serviceManager.registerInstance()
如果某个实例超过15s没有收到心跳,则将它的healthy属性置为false
if (instance.isEphemeral()){添加一个延时执行的定时心跳任务BeatTask();}
2.同步实例信息到nacos server集群其他节点
NacosAutoServiceRegistration
tasks.take()
源码精髓:很多开源框架为了提升操作性能会大量使用这种异步的任务操作,这些操作本身并不需要写入之后立即成功,用这种方式对提升操作性能有很大帮助
GlobalExecutor.submitDataSync()
执行定时任务
同步写实例数据到文件
注册实例结束
instanceController .deregister()
调用server的发送实例心跳接口(HttpMethod.PUT)
调用发送实例心跳接口/nacos/v1/ns/instance/beat
keys.add(key)
将注册请求转发到集群的leader节点
执行实例数据批量同步任务
调用同步实例接口/raft/datum/commit
往阻塞队列tasks里放入注册实例数据
beatReactor.addBeatInfo()
调用server的实例同步接口 HttpMethod.PUT
ephemeralConsistencyService
DelegateConsistencyServiceImpl.put()
如果注册的实例达到一定数量就批量同步给nacos集群中的其他节点,或者距离上一次节点同步达到一定时间也会开始批量同步
spring-cloud-alibaba-nacos-discovery.jar里面的spring.fatories文件里的EnableAutoConfiguration对应的NacosDiscoveryAutoConfiguration
putService(service)
如果同步不成功重试
ephemeralInstances = toUpdateInstances;
阿里自己实现的AP模式的Distro协议
retrySync(SyncTask syncTask)
源码入口
raftStore.write(datum)
taskDispatcher.addTask(key);
如果是临时的实例数据
调用注册实例接口 /nacos/v1/ns/instance
如果某个实例超过30s没有收到心跳,直接剔除该实例,被剔除的实例如果恢复发送心跳则会重新注册
TaskDispatcher.init()
/distro/datum
this.getRegistration()就是NacosServiceRegistration的实例
是
queue.offer(key);
往阻塞队列queue里放入注册实例数据
循环从阻塞队列queue里拿出注册实例数据处理
更新注册实例数据到内存和磁盘文件上
定时心跳任务BeatTask()
serviceRegistry就是NacosServiceRegistry的实例
实现了ApplicationListener接口的类spring容器启动时会调用处理事件方法
service.init()
InstanceController.register()
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
如果是持久化的实例数据
register()
0 条评论
下一页