聊聊Nacos的服务注册和心跳检测
聊聊Nacos的服务注册和心跳检测
nacos可以说在如今的微服务系统中是比较火的一个框架,之前的文章中也有所介绍,今天我再带领大家梳理一下
当我们使用Nacos的时候,会在启动上添加@EnableDiscoveryClient注解,这个注解的意思的开启注册发现,我们从这个注解作为入口出发,深入分析一下源码是怎么实现把服务注册到Nacos服务器上的功能的
客户端处理
注解导入了EnableDiscoveryClientImportSelector类,而EnableDiscoveryClientImportSelector继承了SpringFactoryImportSelector类,重写了selectImports()方法,方法中把AutoServiceRegistrationConfiguration添加到 集合中,这样就能实现AutoServiceRegistrationConfiguration配置的类的自动装配,
我们知道使用@EnableAutoConfiguration 注解后,springboot会加载spring.factories中的EnableAutoConfiguration定义的类,这里会加载NacosServiceRegistryAutoConfiguration等类
NacosServiceRegistryAutoConfiguration定义了三个类,NacosServiceRegistry类是向注册中心注册服务,NacosRegistration是用来存储nacos的信息,NacosAutoServiceRegistration就是实现服务的自动注册的类,它继承了AbstractAutoServiceRegistration类,AbstractAutoServiceRegistration实现了ApplicationListener接口,监听事件执行bind()方法,最终会执行NacosServiceRegistry的register()方法进行注册,
register()方法中主要实现了获取serviceId,然后创建Instance实例对象,然后调用NacosNamingService的registerInstance(),参数正是这两个参数
-
registerInstance()方法中
- 上报心跳💓。先是创建BeatInfo,也就是心跳信息,执行BeatReactor的addBeatInfo()方法,在这个方法中开启了**BeatTask()**线程,这个线程是对心跳信息的上报,这里调用了nacos服务器的api:/nacos//v1/ns/instance/beat进行远程调用
- 服务注册®️。调用NamingProxy的registerService()进行注册实例,这个方法中实际是调用nacos服务器的/nacos/v1/ns/instance来进行注册
服务端的上报心跳接口和服务注册
-
先获取serviceName、namespaceId和集群名称
-
然后调用ServiceManager 的 registerInstance()方法进行实例的注册
注册过程如下:
-
先是创建Service实例,设置参数
-
调用putServiceAndInit方法,这个方法中调用service.init(),然后添加实例,service.init()这个方法中也开启了ClientBeatCheckTask()线程
- ClientBeatCheckTask的run()方法中先获取所有的实例集合,然后遍历,根据传过来的实例的ip和端口取出集合中的实例,检查客户端最后使用时间是否超过15秒,如果超过就设置健康状态为false,如果超过30秒将会删除实例
-
-
然后获取服务Service实例,调用Service的processClientBeat()方法处理心跳,方法中启动了ClientBeatProcessor线程处理心跳
- ClientBeatProcessor的run()方法中先获取所有的实例集合,然后遍历,根据传过来的实例的ip和端口取出集合中的实例,设置实例的健康状态为true
总结
这篇文章主要对Nacos作为注册中心从客户端和服务端的角度分析了服务注册功能和心跳检测功能,主要涉及了几个定时的线程,BeatTask()是客户端发送心跳的线程实现类,ClientBeatCheckTask是服务端进行心跳检测的线程实现类,ClientBeatProcessor是服务端对客户端发送的心跳进行处理的线程类,主要是设置实例健康状态
- 点赞
- 收藏
- 关注作者
评论(0)