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