nacos源码分析-注册中心
2021-10-31 22:22:01 1 举报
登录查看完整内容
nacos源码分析-注册中心
作者其他创作
大纲/内容
nacos集群
TaskExecuteWorker.InnerWorker#run
从多层map中找到实例列表返回
cluster
ServerListManager
NacosExecuteTaskExecuteEngine#addTask
ServiceManager#registerInstance
如果实例不存在则重新注册,防止服务端重启内存注册信息丢失
int target = distroHash(serviceName) % servers.size();
①创建数据模型
InstanceController#list
get /nacos/v1/ns/distro/datums
Service#srvIPs
ServiceManager#addInstance
OperatorController#serverStatus
BlockingQueue#take
心跳注册
集群心跳
仓储系统1
putTask((Runnable) task);
put /nacos/v1/ns/instance/beat 周期 5s
naming.core.Cluster#updateIps
DistroController#onSyncDatum
NacosServiceRegistry#register
DELETE /nacos/v1/ns/instance?ip=xxx&port=xxx&cluster=xxx&serice=xxx&namespace=xxx
采用hash方式实现
②向双map中注册实例
Service#processClientBeat
超过 30s
1.init 开启定时任务检测所有实例的健康状态if (System.currentTimeMillis() - instance.getLastBeat() > instance.getInstanceHeartBeatTimeOut()) 则认为超时,从本地内存注册表中移除实例
节点启动,从其他实例拉取注册信息
DistroProtocol#startDistroTask
ServiceManager#createEmptyService
服务注册表order-1:7001order-2:7001stock-1:7001stock-2:7001
第一次肯定是空,需要去远程获取实例列表
BeatReactor#addBeatInfo
new NacosAutoServiceRegistration
DistroConsistencyServiceImpl.Notifier#run
②向注册消息同步给集群其他实例
1.nacos client是怎么注册的2.nacos服务端是怎么处理服务注册的2.1为什么设计成异步队列形式注册2.2在nacos集群下,服务端注册数据是怎么通信的3.nacos client怎么感知注册表变化(是服务端推动还是客户端轮训)
1.死循环会不会消耗CPU答案:不会,因为take()函数是队列没有任务会阻塞2.为什么设计成异步注册答案:是为了防止注册耗时拖垮 客户端的启动时间
putService(service); service.init();
ServiceManager#putServiceAndInit
基于队列异步注册
BlockingQueue
ApplicationEventPublisher#publishEvent
DistroLoadDataTask#load
②注册实例
get /nacos/v1/ns/operator/server/status
NamingProxy#getAllData
ApplicationListener
DistroProtocol#startLoadTask
NamingProxy#registerService
HostReactor#updateServiceNow
put /nacos/v1/ns/distro/datum
①注册实例
ServerInfoUpdater#run
最终使用UDP方式将注册变更事件发动到对应客户端,客户端收到udp消息后。会回复ACK给服务端,如果最坏情况,服务端没有收到ACK,会超时重传重发,如果还是失败,也不担心,因为客户端有定时拉去兜底
post /nacos/v1/ns/instance
服务注册表定时拉取
InstanceController#beat
DistroSyncChangeTask#run
AbstractAutoServiceRegistration#onApplicationEvent
发布注册实例事件,通知消费端(客户端)
implement
①更新注册信息到内存
PushService#serviceChanged
NacosNamingService#getAllInstances
实例注册
allInstances.addAll(persistentInstances); allInstances.addAll(ephemeralInstances);
超过 5s
移除没心跳地实例
订单系统1
BlockingQueue#offer(E)
①开启心跳
仓储系统2
Ribbon
GlobalExecutor#submitDistroNotifyTask
更新保存在服务端的实例心跳时间
get /nacos/v1/ns/operator/cluster/state
InstanceController#register
OperatorController#getClusterStates
DistroTaskEngineHolder
兜底定时拉取服务注册表
获取全量注册信息
instance
探测nacos实例的集群状态
ServerStatusSynchronizer#send
集群情况下,同步注册信息到其他nacos实例
UDP主动推送
namespace
订单系统
启动注册
PushService#udpPush
DistroConsistencyServiceImpl#processData
客户端心跳
com.alibaba.nacos.naming.core.Service#updateIPs
System.currentTimeMillis() - instance.getLastBeat() > instance.getIpDeleteTimeout()
order order-1:7001 order-2:7001stock stock-1:7001 stock-2:7001
client
DistroConsistencyServiceImpl.Notifier#addTask
service
DistroConsistencyServiceImpl#init
①初始化内存双map和开启服务端心跳任务
feign
private Set<Instance> persistentInstances = new HashSet<>(); private Set<Instance> ephemeralInstances = new HashSet<>();
在lib目录下找到 dspring-cloud-starter-alibaba-nacos-discovery依赖包的spring.factories 可以看到自动配置类NacosServiceRegistryAutoConfiguration
节点之间数据同步:1.集群实例心跳检测2.集群之间注册实例数据同步
.AbstractAutoServiceRegistration
HostReactor#getServiceInfo
instance.setHealthy(false);
DistroHttpAgent#syncData
ClientBeatCheckTask#run
DistroDelayTaskProcessor#process
ServiceManager#removeInstance
NacosAutoServiceRegistration#register
ServerStatusReporter#run
instance.setLastBeat(System.currentTimeMillis());
DistroConsistencyServiceImpl#put
客户端主动获取服务端某个服务实例列表
new DistroDelayTaskProcessor
PushService#onApplicationEvent
检查客户端实例心跳
订单系统2
DistroHttpAgent#getDatumSnapshot
启动拉取服务注册表
DistroLoadDataTask#run
DistroController#getAllDatums
get /nacos/v1/ns/instance/list
System.currentTimeMillis() - instance.getLastBeat() > instance.getInstanceHeartBeatTimeOut()
DistroLoadDataTask#loadAllDataSnapshotFromRemote
定时拉取其他实例的注册信息
NacosNamingService#registerInstance
deleteIp(instance);
开启单线程死循环从BlockingQueue中获取注册任务
ServerListManager#onReceiveServerStatus
.DistroMapper#responsible
定时更新实例列表到本地内存
主动获取远端实例列表
DistroProtocol#DistroProtocol
server
Runnable task = queue.take();
com.alibaba.nacos.naming.core.Service#onChange
DistroConsistencyServiceImpl#onPut
AbstractAutoServiceRegistration#bind
HostReactor#scheduleUpdateIfAbsent
HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
.DistroConsistencyServiceImpl.Notifier#handle
InstanceController#deregister
group
0 条评论
回复 删除
下一页