NACOS服务流程
2021-05-18 10:21:07 1 举报
NACOS服务流程
作者其他创作
大纲/内容
DistroConsistencyServiceImpl
临时实例, AP模式的Distro协议
延时执行的定时任务,更新客户端的服务实例缓存
NacosDiscoveryAutoConfiguration
@Bean
从双Map结构中获取服务,如果没有就创建服务
HttpMethod.POST
deleteIP(instance)
每隔5s定时发送心跳
serviceRegistryregister(getRegistration())
service.processClientBeat(clientBeat)
retrySync(syncTask)
RaftCore
服务健康检查任务
2. 同步实例信息到nacos集群其他节点
DistroController#onSyncDatum
HostReactor
serverProxy.sendBeat(beatInfo)
InstanceController#register
if(dataSize == partitionConfig.getBatchSyncKeyCount() || (System.currentTimeMills() - lastDispatchTime) > partitionConfig.getTaskDispatchPeriod())
失败重试
HealthCheckReactor.scheduleNow(clientBeatProcessor)
服务发现接口
persistenceConsistencyService
添加新注册的实例到服务列表中
NacosRegistration
instance.isEphemeral()
每隔5s执行ClientBeatCheckTask客户端心跳检查任务
implements
/v1/ns/raft/datum/commit
hostReactor.getServiceInfo
数据持久化到本地磁盘
循环从阻塞队列中取出实例数据处理
serviceInit()
instance
往阻塞队列中放入注册的实例数据
KeyBulder.matchEpthemeralKey(key)? ephemeralConsistencyService : persistentConsistencyService
extends
获取服务实例列表
DynamicServerListLoadBalancer#updateListOfServers
如果缓存为空,调用服务接口获取最新的实例数据
添加注册实例到阻塞队列
raftStore.write(datum)
persistentInstances
添加一个定时心跳任务
keys.add(key)
实例超过30s没有收到心跳
1. 将注册实例更新到内存注册表
GlobalExecutor.submitDataSync
/nacos/v1/ns/distro/datum
调用服务注册接口
Cluster
RaftConsistencyServiceImpl
更新注册实例到注册表中
NamingService
实现了Spring事件监听机制,Spring容器启动过程中会调用onApplicationEvent方法
instance setHealthy(false)
Ribbon的调用逻辑
缓存service到双Map结构的serviceMap中
DelegateConsistencyServiceImpl
reqAPI(UtilAndComs.NACOS_URL_BASE + \"/instance/beat\
RaftCOntroller#onPublish
集群模式
服务注册
notifier.addTask(ApplyAction.CHANGE)
queue.offer(key)
putService(service)
start()
利用CountDownLatch实现raft协议节点数据同步逻辑,必须集群半数以上节点写入成功
调用心跳接口
httpClient.execute(httpPut)
clientBeatCheckTask
nacosDiscoveryProperties.namingServiceInstance()
key: com.alibaba.nacos.naming.iplist.ephemeral.public##DEFAULT_GROUP@@service-order
HealthCheckReactor.scheduleCheck(clientBeatCheckTask)
subscribe
RaftStore
putServiceAndInit(service)
反射创建
发布服务变化事件
Service
持久实例,CP模式的Raft协议
NacosServiceRegistry
取消注册实例
服务剔除
将全量实例写入内存注册表
如果实例不存在重新注册,比如:网络问题导致服务下线或者服务端重启临时实例丢失
ClientBeatCheckTask#run
selectInstance
初始化NamingService
ApplyAction.DELETE
当前节点是否为Leader节点?
从缓存中获取实例信息
ApplyAction.CHANGE
服务实例同步
ConsistencyService
执行实例数据批量同步任务
NacosNamingService
服务实例数据提交接口
Nacos服务端心跳接口
/nacos/v1/ns/instance/list
namespace
group-serviceName
向Nacos集群的随机一个节点发送HTTP请求
更新临时实例,服务发现查找临时实例会从cluster的ephemeralInstances获取
心跳续约
更新实例
循环从阻塞队列中获取实例进行处理
返货注册时写入的实例数据
获取实例列表
TaskScheduler#run
GlobalExecutor.submitTaskDispatch(taskScheduler)
NacosServerList#getUpdatedListOfServer
心跳检测任务
提供Nacos的注册功能
实例超过15s没有收到心跳
ephemeralConsistencyService
心跳续约任务
leader节点发布服务,更新注册实例到内存和磁盘上
判断是否是临时实例,默认为true
HttpClient.asyncHttpPostLarge
异步任务更新内存注册表
getPushService().serviceChanged(this)
deregisterInstance
Notifier#run
获取Service
TaskDispatcher
BeatTask#run
DistroConsistencyServiceImpl#put
spring-cloud-common中提供,通过serviceRegistry.register(getRegistration()) 实现注册逻辑
getAllInstance
onApplicationEvent(WebServiceInitializedEventevent)
服务心跳续约
发送心跳请求任务
Cluster#allIPs()
心跳检查任务
HealthCheckReactor.scheduleCheck(checkTask)
否
register()
源码入口spring-cloud-alibaba-nacos-discovery-1.0 RELEASE.jar/META-INF/spring.factories
InstanceController#beat
删除
tasks.take()
NamingProxy.syncData(data.task.getTragetServer())
根据条件获取服务注册实例
同步实例数据到集群其他节点
taskDispatcher.addTask(key)
ServiceRegistry
实现Nacos的自动注册功能
是
延时1s执行定时任务,每隔1s从服务端获取最新实例数据,并缓存到本地
服务端注册接口
ClientBeatprocessor#run
InstanceController#list
从serviceInfoMap中获取客户端的实例缓存信息
NacosAutoServiceRegistration
立刻开启一个任务ClientBeatProcessor更新最后一次心跳时间
AbstractAutoServiceRegistration
listener.onDelete(datumKey)
Nacos服务注册表结构
TaskDispatch#init
allInstances.addAll(persistentInstances);allInstances.addAll(ephemeralInstances)
ApplicationListener
registerInstance
/nacos/v1/ns/instance
注册服务实例,通过Registration构建Instance
如果注册的实例达到一定数量(默认1000)或者距离上一次同步达到一定时间(默认2s) 就批量同步给集群其他节点
获取所有实例(主动拉取)
Instance.setLastBeat(System.currentTimeMills())
DistroConsistencyServiceImpl#init
/nacos/v1/ns/instance/beat
服务订阅
0 条评论
回复 删除
下一页