nacos2.0源码分析-(AP/CP模式)
2021-06-29 15:34:36 3 举报
nacos2.0源码分析-(AP/CP模式)
作者其他创作
大纲/内容
发送服务变化事件
本节点是否leader
DistroConsistencyServiceImpl.init()
notifier.run()
listener就是service的实例,将注册实例信息更新到注册表的内存结构里
@Bean
将新注册的实例加入对应的服务service的实例列表中
ClientBeatCheckTask
将service对应的全量实例instances写入内存注册表
namingService.registerInstance
AbstractAutoServiceRegistration
serverProxy.registerService()
同步实例信息给集群中的其他节点
NacosServiceRegistry
DistroVerifyTimedTask.run()
创建内存注册表结构
createServiceIfAbsent()
DistroController.onSyncDatum()
调用server的注册实例接口(HttpMethod.POST)
persistentConsistencyService
DistroVerifyExecuteTask.run()
调用server的实例注销接口,HttpMethod.DELETE
JRaftProtocol.write(request)
否
源码精髓:集群数据同步的一种方案,批量异步同步
transportAgent.getDatumSnapshot(each.getAddress())
如果某个实例超过15s没有收到心跳,则将它的healthy属性置为false
NacosAutoServiceRegistration
tasks.take()
源码精髓:很多开源框架为了提升操作性能会大量使用这种异步的任务操作,这些操作本身并不需要写入之后立即成功,用这种方式对提升操作性能有很大帮助;通过事件模型把生产和消费者策底解耦,利于后续的扩展;distro协议2.0 基本就是通过task解耦了数据同步,数据复制,节点同步这些过程,1.0版本的代码是相互耦合的
执行定时任务
注册实例结束
instanceController .deregister()
调用server的发送实例心跳接口(HttpMethod.PUT)
调用发送实例心跳接口/nacos/v1/ns/instance/beat
往阻塞队列tasks里放入注册实例数据
DelegateConsistencyServiceImpl.put()
spring-cloud-alibaba-nacos-discovery.jar里面的spring.fatories文件里的EnableAutoConfiguration对应的NacosDiscoveryAutoConfiguration
ephemeralConsistencyService
putService(service)
如果同步不成功不重试
阿里自己实现的AP模式的Distro协议
dataProcessor.processSnapshot(distroData)
如果是临时的实例数据
DistroProtocol.startLoadTask();
更新注册实例数据到内存和磁盘文件上
定时心跳任务BeatTask()
serviceRegistry就是NacosServiceRegistry的实例
writeAsync(request)
service.init()
InstanceController.register()
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
instance.setHealthy(false)
register()
BeatTask
新节点初始化镜像数据
NacosRegistration
DistroProtocol.startVerifyTask();
实现
循环从阻塞队列tasks中拿实例数据去处理
DistroProtocol
deleteIP(instance)
基于蚂蚁SofaJraft 实现的CP模式
nacos-Server服务端
putServiceAndInit(service)
GlobalExecutor.schedulePartitionDataTimedSync(taskScheduler)
GlobalExecutor.submitDistroNotifyTask(notifier);
loadAllDataSnapshotFromRemote(each)
将临时的注册实例更新到了cluster的ephemeralInstances属性上去, 服务发现查找临时实例,最终从内存里找到的就是这个属性
extends
Nacos 2.0 Raft协议主要依赖SofaJraft库实现
ApplicationListener
start()
1.将注册实例更新到内存注册表
NacosDiscoveryAutoConfiguration
bind(event)
调用注销实例接口 /nacos/v1/ns/instance
client客户端
processData(distroData.getContent())
serverProxy.sendBeat(beatinfo)
serviceRegistry.register(this.getRegistration())
onApplicationEvent()
InstanceController
getPushService().serviceChanged(this)
服务注册
InstanceOperatorServiceImpl.registerInstance()
load()
if (instance.isEphemeral()){添加一个延时执行的定时心跳任务BeatTask();}
2.同步实例信息到nacos server集群其他节点
doSyncVerifyData(each)
将注册请求转发到集群的leader节点
Jraft源码精髓:Jraft相对与其他Raft库性能提升的主要原因是Jraft引入了批量提交提升Raft写入性能,同时利用节点一致性简化了同步状态的验证,同步状态一致的情况下允许数据可读提升了读取性能
执行实例数据批量同步任务
调用Jraft同步实例接口 node.apply(task)
beatReactor.addBeatInfo()
调用server的实例同步接口 HttpMethod.PUT
如果注册的实例达到一定数量就批量同步给nacos集群中的其他节点,或者距离上一次节点同步达到一定时间也会开始批量同步
ephemeralInstances = toUpdateInstances;
DistroLoadDataTask.run()
[DISTRO-FAILED] Verify distro data failed!
源码入口
调用注册实例接口 /nacos/v1/ns/instance
如果某个实例超过30s没有收到心跳,直接剔除该实例,被剔除的实例如果恢复发送心跳则会重新注册
/distro/datum
this.getRegistration()就是NacosServiceRegistration的实例
是
往加锁的Map里放入注册实例数据
distroComponentHolder.getDataStorageTypes
增量同步任务
实现了ApplicationListener接口的类spring容器启动时会调用处理事件方法
如果是持久化的实例数据
0 条评论
下一页