nacos服务注册和发现
2024-07-26 14:51:03 0 举报
AI智能生成
登录查看完整内容
nacos服务注册和发现
作者其他创作
大纲/内容
NacosServiceRegistryAutoConfiguration配置类,配置了NacosAutoServiceRegistration:用于自动服务注册NacosServiceRegistry:服务注册的具体实现类
NacosAutoServiceRegistration如何实现自动服务注册到nacos的了?监听WebServerInitializedEvent的事件,此事件是:SevletWebServerInitializedEvent的父类然后SevletWebServerInitializedEvent是什么时候发布的事件了?是AbstractApplicationContext的refresh里面的finishRefresh调用的WebServerStartStopLifeCycle#start方法
接下来是具体执行事件内容了调用NacosServiceRegister#register方法,该方法获取对应的namingService,然后调用namingService#registerInstance
调用ServiceManager#registerInstance方法
首先发起定时任务对该注册的服务进行服务健康检测:HealthCheckReactor,每隔五秒钟检查一次,超过15秒,设置服务状态为不健康,当超过30秒,则剔除服务从对应的map中其次对service里面的Cluster进行初始化
获取实例,首先调用ServiceManager#updateIpAddresses获取对应的服务实例
写时复制这里是怎么实现的?将原来的实例放到一个新的容器中,如果新增,则新增,如果修改,则删掉原来的,再添加一个新的如果删除,则删除最后将新的容器赋值给对应的对象中:ephemeralInstances,persistentInstances
内部类Notify实现Runnable接口的方法什么时候执行,因为前面通过AddTask添加到内存队列中了?在DistroConsistencyServiceImpl添加了@PostConstruct的init方法新建了一个线程,而Notify的run方法是一个死循环的方法,该方法通过handle方法调用Service#onChange方法,里面updateIPs通过写时复制的方式,完成了实例的注册
发布ServiceChangeEvent事件
监听事件的对象:PushService通过udp的方式向所有的客户端发起通知,告知该服务实例的内容发生变更(注意,客户端有定时拉取的,也有服务端发现服务实例变更后,主动推送给客户端,然后客户端发生变更)
注册实例,如果是临时节点:调用DistroConsistencyServiceImpl#put方法,调用该方法,首先会把实例信息封装到Datum对象,并保存在DataStore中,其中key为注册服务信息,value为实例信息然后通过Notifier#addTask将服务key添加到ArrayBlockingQueue中
注册服务实例
发起注册到nacosSever会发生什么了?
namingService#registerInstance方法主要做有2个事情第一:发起心跳:如果是临时服务,则添加定时任务:BeatTask,每隔5秒钟向nacos-server:/instance/beat发起心跳定时任务的实现方式是:每心跳一次,然后延迟5秒钟开启下一次任务第二是:注册服务,向nacos-server的:/instance发起post请求
服务注册和心跳
执行DynamicServerListLoadBalancer#restOfInit
执行DynamicServerListLoadBalancer#updateListOfServers
NacosServerList#getUpdatedListOfServers
HostReactor#getServiceInfo
HostReactor#updateServiceNow
NamingProxy.queryList
服务发现
nacos服务注册和发现
0 条评论
回复 删除
下一页