nacos源码流程导读
2021-11-25 17:37:02 2 举报
nacos源码流程导读,帮助您更快人一步的了解nacos!
作者其他创作
大纲/内容
service.init()
NacosAutoServiceRegistration
返回的就是注册时写入的实例属性
/nacos/v1/ns/distro/datum
putServiceAndInit(service)
retrySync(syncTask)
hostReactor.getServiceInfo()
将临时的注册实例更新到了cluster的ephemaeralInstance属性上去,服务发现查找临时实例最终从内存里找到的就是这个属性
ServiceReporter#run()
集群节点状态同步任务
调用server的实例注册接口(HttpMethod.POST)
DelegateConsistencyServiceImpl#put()
service.srvIPs()
int target = distroHash(serviceName) % servers.size()
List<Instance> allInstances = new ArrayList<>(); allInstances.addAll(persistentInstances); allInstances.addAll(ephemeralInstances);
源码入口
serviceRegistry就是NacosServiceRegistry
ephemeralInstances = toUpdateInstances
TaskScheduler#run()
deleteIp(instance)
onApplicationEvent()
instance.isEphemeral()
System.currentTimeMillis() - instance.getLastBeat() > instance.getIpDeleteTimeout()
true
bind()
implements
ClientBeatCheckTask#run()
如果缓存为空,调用server接口获取最新服务数据
taskDispatcher.addTask(key)
2.同步实例信息到nacos server集群其它节点
start()
服务名称hash后对机器数取模,选择集群里的一台机器执行任务
raftProxy.proxyPostLarge()(将注册请求转发到集群的leader节点)
ClientBeatProcessor#run()
是否为持久化数据
getPushService().serviceChanged(this)
注册服务实例信息在集群节点间同步任务
Nacos集群新节点启动时向其它节点拉取数据同步流程,从这里开始
UpdateTask#run()
如果某个实例超过15秒没有收到心跳,则将它的healthy属性置为false
最后会更新lastRefTime为当前时间
ServerListManager#init()
AbstractAutoServiceRegistration
将注册实例信息更新注册表内存结构里去
GET /nacos/v1/ns/raft/datum/commit
PushService#onApplicationEvent()
spring容器启动时会调用处理事件方法
/nacos/v1/ns/instance/beat
false
延时执行的定时任务更新客户端的服务缓存
doSrvIpxt()
raftStore.write(datum)
GlobalExecutor.submitDistroNotifyTask(notifier)
tasks.take()
instance.setHealthy(false)
putService(Service service)
DistroConsistencyServiceImpl#init()
调用server的服务发现接口(HttpMethod.GET)传入的参数里有客户端的udp端口,这个方便服务端实例有变化了通过udp方式同步给客户端
如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
集群节点之间相互节点状态,如果有节点宕机了,集群其他节点会感知到并更新集群节点的状态,这个会影响心跳任务机器选择的计算
InstanceController#register()
Notifier#run()
NacosRegistration
ApplicationListener
HttpClient.asyncHttpPostLarge()
register()
serviceInfoMap客户端实例缓存map
getDistroMapper().responsible(service.getName())
阿里自己实现的CP模式的简单Raft协议
POST /nacos/v1/ns/instance
Server
服务发现
BeatReactor#addBeatInfo()
立即开启一个任务ClientBeatProcessor,更新客户端实例的最后心跳时间
将service对应的全量实例instance写入内存注册表
DELTE /nacos/v1/ns/instance
/nacos/v1/ns/instance/list
@Bean
服务注册
利用ConuntDownLatch实现了一个简单的raft协议写入数据的逻辑,必须集群半数以上节点写入成功才会给客户端返回成功
ServiceManager#init()
将新注册实例加入对应服务service的实例列表里去
instance.setLastBeat(System.currentTimeMillis())
InstanceController#beat()
NacosNamingService#getAllInstances()
DistroController#onSyncDatum()
如果实例不存在重新注册(如果网络不通导致实例在服务端被下线或服务端重启临时实例丢失)
如果同步不成功,则进行重试
TaskDispatcher#init()
serverProxy.registerService()
extends
System.currentTimeMillis() - instance.getLastBeat() > instance.getInstanceHeartBeatTimeOut()
1.将注册实例更新到内存注册表
BeatTask#run()
HealthCheckReactor.scheduleCheck(clientBeatCheckTask)
同步实例信息给集群其他节点
udp方式服务变动通知给订阅的客户端
client
NacosServiceRegistry
NacosServiceRegistryAutoConfiguration
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2.2.3.RELEASE</version></dependency>nacos 版本号:1.3.2
同步的发起机器就是做健康检查任务的那台机器
distroMapper.responsible(serviceName)
isLeader()
DistroConsistencyServiceImpl#put()
定时获取服务端最新服务数据并更新到本地的任务
ServerStatusReporter#run()
RaftConsistencyServiceImpl#put()
InstanceController#list
service.processClientBeat(clientBeat)
获取客户端的服务实例缓存信息
serviceRegistry.register(getRegistration())
serverProxy.sendBeat()
是否为leader节点
getRegistration()就是NacosRegistration的实例
0 条评论
下一页