nacos服务注册和发现
2024-07-26 14:51:03 0 举报
AI智能生成
nacos服务注册和发现
作者其他创作
大纲/内容
服务注册和心跳
自动装配,discovery的starter里面包含spring.factories,
里面有EnableAutoConfiguration的为key的配置类:NacosServiceRegistryAutoConfiguration等
里面有EnableAutoConfiguration的为key的配置类:NacosServiceRegistryAutoConfiguration等
NacosServiceRegistryAutoConfiguration配置类,配置了
NacosAutoServiceRegistration:用于自动服务注册
NacosServiceRegistry:服务注册的具体实现类
NacosAutoServiceRegistration:用于自动服务注册
NacosServiceRegistry:服务注册的具体实现类
NacosAutoServiceRegistration如何实现自动服务注册到nacos的了?
监听WebServerInitializedEvent的事件,此事件是:SevletWebServerInitializedEvent的父类
然后SevletWebServerInitializedEvent是什么时候发布的事件了?
是AbstractApplicationContext的refresh里面的finishRefresh调用的WebServerStartStopLifeCycle#start方法
监听WebServerInitializedEvent的事件,此事件是:SevletWebServerInitializedEvent的父类
然后SevletWebServerInitializedEvent是什么时候发布的事件了?
是AbstractApplicationContext的refresh里面的finishRefresh调用的WebServerStartStopLifeCycle#start方法
接下来是具体执行事件内容了
调用NacosServiceRegister#register方法,该方法获取对应的namingService,然后调用
namingService#registerInstance
调用NacosServiceRegister#register方法,该方法获取对应的namingService,然后调用
namingService#registerInstance
namingService#registerInstance方法主要做有2个事情
第一:发起心跳:如果是临时服务,则添加定时任务:BeatTask,每隔5秒钟向nacos-server:/instance/beat发起心跳
定时任务的实现方式是:每心跳一次,然后延迟5秒钟开启下一次任务
第二是:注册服务,向nacos-server的:/instance发起post请求
第一:发起心跳:如果是临时服务,则添加定时任务:BeatTask,每隔5秒钟向nacos-server:/instance/beat发起心跳
定时任务的实现方式是:每心跳一次,然后延迟5秒钟开启下一次任务
第二是:注册服务,向nacos-server的:/instance发起post请求
发起注册到nacosSever会发生什么了?
调用ServiceManager#registerInstance方法
调用createEmptyService创建空的Service并且添加到双层serviceMap:Map(namespace, Map(group::serviceName, Service)).
首先发起定时任务对该注册的服务进行服务健康检测:HealthCheckReactor,每隔五秒钟检查一次,超过15秒,设置服务状态为不健康,当超过30秒,则剔除服务从对应的map中
其次对service里面的Cluster进行初始化
其次对service里面的Cluster进行初始化
注册服务实例
获取实例,首先调用ServiceManager#updateIpAddresses获取对应的服务实例
注册实例,如果是临时节点:调用DistroConsistencyServiceImpl#put方法,调用该方法,首先会把实例信息封装到Datum对象,并保存在DataStore中,其中key为注册服务信息,value为实例信息
然后通过Notifier#addTask将服务key添加到ArrayBlockingQueue中
然后通过Notifier#addTask将服务key添加到ArrayBlockingQueue中
内部类Notify实现Runnable接口的方法什么时候执行,因为前面通过AddTask添加到内存队列中了?
在DistroConsistencyServiceImpl添加了@PostConstruct的init方法新建了一个线程,而Notify的run方法是一个
死循环的方法,该方法通过handle方法调用Service#onChange方法,里面updateIPs通过写时复制的方式,完成了实例的注册
在DistroConsistencyServiceImpl添加了@PostConstruct的init方法新建了一个线程,而Notify的run方法是一个
死循环的方法,该方法通过handle方法调用Service#onChange方法,里面updateIPs通过写时复制的方式,完成了实例的注册
写时复制这里是怎么实现的?
将原来的实例放到一个新的容器中,
如果新增,则新增
,如果修改,则删掉原来的,再添加一个新的
如果删除,则删除
最后将新的容器赋值给对应的对象中:ephemeralInstances,persistentInstances
将原来的实例放到一个新的容器中,
如果新增,则新增
,如果修改,则删掉原来的,再添加一个新的
如果删除,则删除
最后将新的容器赋值给对应的对象中:ephemeralInstances,persistentInstances
在Service#updateIPs中,当执行完clusterMap.get(entry.getKey()).updateIps(entryIPs, ephemeral),即对服务实例发生变更后(增删改)
则需要通知客户端,服务端的注册的实例发生了变更,则执行:getPushService().serviceChanged(this)
则需要通知客户端,服务端的注册的实例发生了变更,则执行:getPushService().serviceChanged(this)
发布ServiceChangeEvent事件
监听事件的对象:PushService
通过udp的方式向所有的客户端发起通知,告知该服务实例的内容发生变更
(注意,客户端有定时拉取的,也有服务端发现服务实例变更后,主动推送给客户端,然后客户端发生变更)
通过udp的方式向所有的客户端发起通知,告知该服务实例的内容发生变更
(注意,客户端有定时拉取的,也有服务端发现服务实例变更后,主动推送给客户端,然后客户端发生变更)
服务发现
当前服务本身发现,首先不断发现自己本身的服务,
finshReferesh()-》startBeans->NacosWatch#start->namingService#subscribe
->hostReactor#subscribe->getServiceInfo->updateServiceNow->HostReactor#updateServive->serverProxy#queryList(/instance/list),
执行完后,发起定时任务HostReactor.scheduleUpdateIfAbsent,定时执行任务为UpdateTask,间隔时间默认一秒,
计算公司如下:Math.min(delayTime << failCount, DEFAULT_DELAY * 60)
finshReferesh()-》startBeans->NacosWatch#start->namingService#subscribe
->hostReactor#subscribe->getServiceInfo->updateServiceNow->HostReactor#updateServive->serverProxy#queryList(/instance/list),
执行完后,发起定时任务HostReactor.scheduleUpdateIfAbsent,定时执行任务为UpdateTask,间隔时间默认一秒,
计算公司如下:Math.min(delayTime << failCount, DEFAULT_DELAY * 60)
Fegin远程服务发现,
以ribbon为例,在RibbonClientConfiguration定义了@Bean的ribbonLoadBalancer,实际类型为:ZoneAwareLoadBalancer
在实例化过程中调用构造函数完成服务的发现,
执行完后,发起定时任务HostReactor.scheduleUpdateIfAbsent,定时执行任务为UpdateTask,间隔时间默认一秒,
计算公司如下:Math.min(delayTime << failCount, DEFAULT_DELAY * 60)
以ribbon为例,在RibbonClientConfiguration定义了@Bean的ribbonLoadBalancer,实际类型为:ZoneAwareLoadBalancer
在实例化过程中调用构造函数完成服务的发现,
执行完后,发起定时任务HostReactor.scheduleUpdateIfAbsent,定时执行任务为UpdateTask,间隔时间默认一秒,
计算公司如下:Math.min(delayTime << failCount, DEFAULT_DELAY * 60)
执行DynamicServerListLoadBalancer#restOfInit
执行DynamicServerListLoadBalancer#updateListOfServers
NacosServerList#getUpdatedListOfServers
NacosNamingService#selectInstances(serviceId, group, true)
HostReactor#getServiceInfo
HostReactor#updateServiceNow
NamingProxy.queryList
0 条评论
下一页