Nacos注册中心
2022-07-23 13:41:31 1 举报
登录查看完整内容
Nacos 注册中心源码流程,服务注册、心跳、服务发现、健康检查实现流程
作者其他创作
大纲/内容
Instance
true
offer()
执行延时任务的run()BeatTask(beatInfo)
springboot nacos java client
nacos属性配置类
创建客服端注册实例instanceInstance instance = getNacosInstanceFromRegistration(registration);
3
Pair
key=group::serviceName
心跳超时,删除当前实例,默认超时时间30sfor (Instance instance : instances){ if(currentTimeMillis-LastBeat>DeleteTimeout) deleteIp(instance);}
向nacos服务端发送心跳,告知服务端自己还能提供服务reqAPI(UtilAndComs.NACOS_URL_BASE + \"/instance/beat\
健康状态
是(默认)
take()
POST
Instances instances = new Instances();instances.setInstanceList(instanceList);
new NacosAutoServiceRegistration
key=clusterName
Service
NacosServiceRegistry
5
Nacos Server
服务发现
获取服务下所有临时实例List<Instance> instances = service.allIPs(true);
将instance放入同一个key:clusterName中List<Instance> clusterIPs = ipMap.get(instance.getClusterName());clusterIPs.add(instance);
当前服务下的所有实例最后一次心跳时间为当前时间for (Instance instance : instances){ instance.setLastBeat(System.currentTimeMillis());}
参数
processServiceJSON(result);
1
注册实例请求
@Bean
添加心跳信息beatReactor.addBeatInfo
发布事件
2
继承
action == DataOperation.CHANGE
ClientBeatCheckTask.run()
false
数据同步接口(PUT)url:/v1/ns/distro/datumcom.alibaba.nacos.naming.controllers.DistroController
serverProxy.queryList
serviceMap(ConcurrentSkipListMap)
action == DataOperation.DELETE
嵌套调用
Web容器初始化完成事件监听器ApplicationListener<WebServerInitializedEvent>
distroProtocol.sync()
putServiceAndInit(service);
url:/nacos/v1/ns/instancecom.alibaba.nacos.naming.controllers.InstanceController
创建心跳处理器ClientBeatProcessor clientBeatProcessor = new ClientBeatProcessor();
register();
4
再次调用延时任务
null == serviceObj
Cluster
注册实例
NacosDiscoveryProperties
端口
key=namespace
注册
http请求获取服务列表reqAPI(/instance/list)
心跳超时,设置健康状态false,默认超时时间5sfor (Instance instance : instances){ if(currentTimeMillis-LastBeat>BeatTimeOut) instance.setHealthy(false);}
权重
监听web容器初始化完成事件onApplicationEvent;bind(event);
添加两个监听器(临时实例和持久化实例监听器),用来异步注册实例数据consistencyService.listen(service)
clusterMap
service = new Service();
选择更新临时实例还是持久实例Set<Instance> toUpdateInstances = ephemeral ? ephemeralInstances : persistentInstances;
响应时间
开启线程异步注册实例数据到nacos注册表thread
否
获取实例数据instancedataStore.get(datumKey).value
元数据
创建心跳BeatInfo beatInfo = new BeatInfo();
toUpdateInstances经过更新后直接覆盖原来的值if (ephemeral) { ephemeralInstances = toUpdateInstances; } else { persistentInstances = toUpdateInstances; }
DistroConsistencyServiceImpl
是否是临时实例instance.isEphemeral()
删除实例数据 listener.onDelete(datumKey);
UpdateTask.run()
Service.onChange()
dataProcessor.processData(distroData);
获取当前心跳在注册表中对应的实例Instance instance = serviceManager.getInstance
ip
SpringApplication.run()
容器加载完成finishRefresh();
调用接口进行数据同步(PUT)url:/distro/datumHttpClient.httpPutLarge()
hostReactor.getServiceInfo
处理客服端心跳service.processClientBeat(clientBeat);
集群环境下同步数据for (Member each : memberManager.allMembersWithoutSelf())
instance = new Instance();
NacosRegistration
refresh()
new
clientBeatProcessor .run()
distroProtocol.onReceive(distroHttpData);
ConcurrentSkipListMap
下线状态
执行线程run方法Notifier.run()
从客服端请求中获取注册实例。如:服务名、ip+port、metadata等实例信息Instance instance = parseInstance(request);
开启线程,异步处理心跳HealthCheckReactor.scheduleNow(clientBeatProcessor);
url:/nacos/v1/ns/instance/beatcom.alibaba.nacos.naming.controllers.InstanceController
更新本地缓存updateServiceNow/refreshOnly
persistentInstances(Set)
toUpdateInstances = new HashSet<>(ips);
如果是nacos集群,选择其中一台做健康检查getDistroMapper().responsible(service.getName()
tasksArrayBlockingQueue
NacosServiceRegistryAutoConfiguration
获取监听器listeners.get(datumKey)
putService(service);
instance == null
定时更新缓存
心跳请求
健康检查HealthCheckReactor.scheduleCheck(clientBeatCheckTask);
service.init();
publishEvent
获取服务列表NacosNamingService.getAllInstances
NacosAutoServiceRegistration
ephemeralInstances(Set)
加载nacous 自动配置类
register(HttpServletRequest request)
从缓存中获取服务列表return serviceInfoMap.get(serviceObj.getKey());
0 条评论
回复 删除
下一页