点击蓝字关注我们
大家好,我是杰哥 上周,我们通过文章Spring Cloud(六):注册中心nacos-服务端视角 篇 ,站在nacos的服务端的视角,对nacos作为注册中心的服务端节点之间的选举、心跳、服务注册以及同步等主要动作进行了梳理说明 那么,如果想要对与nacos作为注册中心有一个全面的了解呢,今天就继续跟着杰哥一起,转向客户端的角度,来探究一波吧~ 关于如何实现Nacos客户端,以及客户端的consumer如何如调用provider的服务,可以参考文章 Spring Cloud(五):注册中心-nacos篇 ,进行实现 等你实现以后,再进入下面的源码探究环节,可能会更快速进入节奏哦~ 首先,我们从初始化步骤开始,进入源码环节一 准备
初始工作
nacos作为注册中心,它的初始化是由NacosNamingService.init()方法进行的 我们一起看看,init()方法里都做了什么 1)初始化命名空间namespace: initNamespaceForNaming() 在Nacos中,命名空间用于租户粗粒度隔离,同时还可以进行环境的区别,如开发环境和测试环境等等 2)初始化服务器地址:initServerAddr() 3)初始化web上下文:initWebRootContext() 它支持通过阿里云EDAS进行部署 4)初始化缓存目录:initCacheDir() 5)初始化日志文件名称:调用initLogName()方法,从配置中获取日志文件 接下来,就是我们要看的重点了 1)初始化事件分发监听器EventDispatcher 当客户端订阅了某个服务信息后,会以Listener的方式注册到EventDispatcher的队列中,当有服务变化的时候,便会通知订阅者 2)初始化服务端代理NamingProxy 用于客户端与服务端的通信 3)初始化心跳通信类BeatReactor 用于维持与服务器之间的心跳通信,上报客户端注册到服务端的服务信息 4)初始化服务信息更新器HostReactor 用于客户端服务的订阅,以及从服务端更新服务信息。对了,也就是说客户端会使用HostReactor进行订阅操作,订阅了之后,上面说到的事件分发监听器EventDispatcher会将服务信息通知给订阅者咯~二 重点
步骤源码
01.服务更新
EventDispatcher是一个事件分发器,它维护了一个有变更的服务的队列changedServices
private BlockingQueuechangedServices
= new LinkedBlockingQueue();
以及一个对于某个服务的监听者列表ConcurrentMap:observerMap
private ConcurrentMap, List> observerMap= new ConcurrentHashMap, List>();
其中key为服务名称,value为监听这个服务变更的客户端实例列表 也就是说,EventDispatcher会实时地将服务变化信息,同步给监听该服务变化信息的客户端,使得该客户端可以进行后续动态操作
小结 1
EventDispatcher工作流程
02.心跳
首先,在初始化NacosNamingService.init()中,我们看到nacos已经对心跳类BeatReactor进行了初始化,那么在什么时候会开始进行第一次心跳呢? 答案是:实例第一次注册的时候。第一次开启并执行了心跳任务,会再开启下一次心跳的定时任务,一直继续下去,直到该实例下线 1)进入addBeatInfo()方法 实例注册的时候调用了addBeatInfo()方法,并且默认时间间隔为5s 2)进入BeatReactor.addBeatInfo()方法 该方法通过ScheduledExecutorService执行BeatTask任务 那么只需要看一下该方法的run()方法,就可以知道心跳任务的具体执行逻辑了 3)进入BeatTask.run()