nacos1.4.X版本服务注册源码分析

发布时间 2023-09-20 19:56:58作者: warrior1234

 

客户端:

nacos1.4.1版本服务注册流程

1:依赖spring-cloud-starter-alibaba-nacos-discovery

2:resources/META-INF/spring.factories 自动配置 NacosServiceRegistryAutoConfiguration

3: 自动配置类NacosAutoServiceRegistration 继承 AbstractAutoServiceRegistration 实现ApplicationListener<WebServerInitializedEvent>

4:服务启动完成后,发布事件调用onApplicationEvent方法

5:org.springframework.cloud.client.serviceregistry.AbstractAutoServiceRegistration#start

com.alibaba.cloud.nacos.registry.NacosAutoServiceRegistration#register

com.alibaba.cloud.nacos.registry.NacosServiceRegistry#register

6:namingService.registerInstance引入nacos关键实例NacosNamingService调用注册实例

7:如果是临时节点,启动心跳线程延迟5s运行,调用地址:/instance/beat,执行成功再次发起一个延迟任务,延迟时间取自服务端响应 clientBeatInterval
如果请求资源不存在,则发送一个注册请求

8:向所有节点发送http请求调用nacos服务注册接口

 


服务端:

1:com.alibaba.nacos.naming.controllers.InstanceController#beat /instance/beat 服务端处理心跳请求

1.1 从缓存中获取实例instance
如果不存在,且不包含beat开启标记,则返回RESOURCE_NOT_FOUND,说明没有注册成功(客户端初次注册时发生)
如果不存在,且包含beat开启标记(说明实例被刚刚踢掉),则服务端直接注册实例
如果实例存在,则返回成功标记(包含lightBeatEnabled心跳正常、clientBeatInterval客户端心跳间隔,默认5s)

2:com.alibaba.nacos.naming.controllers.InstanceController#register /instance/register 服务端处理实例注册请求

命名空间-> (分组::服务名称-> 服务)
Map(namespace, Map(group::serviceName, Service)) 服务端实例注册数据结构

com.alibaba.nacos.naming.core.Service#clusterMap com.alibaba.nacos.naming.core.Cluster#ephemeralInstances

1.1 解析请求并组装实例

1.2 注册实例 com.alibaba.nacos.naming.core.ServiceManager#registerInstance

1.2.1 判断注册实例数据结构是否存在,com.alibaba.nacos.naming.core.ServiceManager#createEmptyService

1.2.2 如果数据结构不存在,则创建数据结构 & 缓存服务service并初始化服务 com.alibaba.nacos.naming.core.ServiceManager#putServiceAndInit

putService(service) 服务放置到缓存中

service.init() 初始化服务 列出服务对应的所有实例,最后心跳更新时间距离现在大于15s,则设置为不健康。大于30s,则直接从缓存中删除 ClientBeatCheckTask

实例注册过程:

com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl#put

com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl#onPut
组装为Datum,并放到dataStore map中,然后将key放置到阻塞队列ArrayBlockingQueue,tasks.offer, 启动线程阻塞take数据

com.alibaba.nacos.naming.core.Service#onChange 处理变更请求

clusterMap.get(entry.getKey()).updateIps(entryIPs, ephemeral) 更新后重新赋值

1.3:其他
3.1 udp推送数据 getPushService().serviceChanged(this)
com.alibaba.nacos.naming.push.PushService#serviceChanged 发布事件

com.alibaba.nacos.naming.push.PushService#onApplicationEvent 处理事件&推送数据给客户端

3.2 异步注册实例
com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.Notifier#addTask 添加服务
com.alibaba.nacos.naming.consistency.ephemeral.distro.DistroConsistencyServiceImpl.Notifier#run 启动异步线程死循环取数据进行处理

3.3 服务端健康检查
com.alibaba.nacos.naming.core.Service#init 初始化服务时

HealthCheckReactor.scheduleCheck(clientBeatCheckTask)


3:com.alibaba.nacos.naming.controllers.InstanceController#deregister 注销实例

3.1 先从缓存中获取所有实例,然后删除当前需要注册的实例 substractIpAddresses(service, ephemeral, ips)

3.2 consistencyService.put(key, instances) 注销实例,流程和注册过程一致