Nacos做服务注册与发现中心

910 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

hi ,大家好,我是三天打鱼,两天晒网的小六六,欢迎大家关注我的公众号:"六脉神剑的程序人生",一起学习,一起进步

絮叨

前面分析了一下Nacos做服务的分布式配置中心的一些核心原理,想着我们项目也是用他来做服务的注册与发现,所以呢?找个时间把他分析分析还是很有必要的。

服务注册

我们直接从官方例子入手吧,其实Nacos也是spring cloud 的一个实现而已。我们来看看他吧 一看其实还蛮简单的嘛,我们往里面跟一下代码

创建 NamingService 代码如下

其实就是利用反射,找到他的构造方法,果然是一个人写的,和配置中心的套路是一模一样的,我们继续往下跟

所以重要的还是他下面的init方法

下面的几个我们一个个来看

EventDispatcher:事件分发器 用于管理EventListener。内部定义ScheduledThreadPoolExecutor周期调度器,创建名为com.alibaba.nacos.naming.client.listener线程周期的执行Notifier任务(通过Notifier向注册的EventListener中发生NamingEvent事件,可用于本地扩展(实现ApplicationListener接口监控NamingEvent事件))

BeatReactor:客户端与服务端周期心跳检测类,内部定义ScheduledThreadPoolExecutor周期调度器,创建名为com.alibaba.nacos.naming.beat.sender线程周期的执行BeatTask任务(该类为BeatReactor中的一个内部类用于向服务端发送心跳信息,最终通过httpclient发送路径为/instance/beat的http请求),内部维护以serviceName+groupName+ip+host为key,BeatInfo为value的map,当client初始化向服务端注册实例时会创建一个BeatInfo对象,通过BeatReactor中addBeatInfo()函数写入,并在beatInfo属性period(默认5s)后调度一次BeatTask。关于心跳检测可以参考后续对心跳机制描述

HostReactor:客户端周期去拉取服务端代码,内部定义ScheduledThreadPoolExecutor周期调度器,创建名为com.alibaba.nacos.client.naming.updater线程周期的执行UpdateTask任务(该类为HostReactor中的一个内部类用于更新client中缓存的服务注册列表信息,在获取列表的同时,告诉服务度它的udp端口号信息,服务端生成对应的PushClient对象,一旦服务端中对应的Service信息发生来变更,服务端可以通过PushClient进行发送变更信息。UpdateTask以Service-cluster组合为单位来周期更新的,更新频率默认1s可设置。通过updateServiceNow()发送http请求-/instance/list)

注册方法

我们继续来看看这个方法

其实也是很简单,一个是维持心态检测的,下面就是真正的注册了

客户端服务注册流程图

日常求赞

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才

创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见

六脉神剑 | 文 【原创】如果本篇博客有任何错误,请批评指教,不胜感激 !