Nacos集群管理类剖析
2022-03-31 10:22:34 14 举报
详细剖析nacos ServerMemberManager 类,包括类图,设计及核心实现
作者其他创作
大纲/内容
ServerMemberManager-2
MemberInfoReportTask<Runnable>
AbstractMemberLookup
getSelf().setState(NodeState.UP)这段代码十分合理!对嘛,服务已经启动,肯定要将自己状态设置成UP啊!
compose
Part-3拆解
WatchDirJob <Thread>
继承
Part-2类图
经典类结构
NacosAsyncRestTemplate
broadcast
update
FileConfigMemberLookup
NacosRestTemplate
第三个细节:集群成员变化后管理器到底怎么更新
文件寻址就是找服务器下的cluster.conf配置。这里单独说下这个接口,是jdk1.7后提供的文件监听类,很好用!
AddressServerSyncTask <Runnable>
组合
LookupFactory
看最上面!前一步我们已经new出来了这个对象,ServerMemberManager本身又实现了ApplicationListerner接口。 这个接口的实现意义重大,说明了这个管理器本身也是一个监听器。监听了WebServerInitializedEvent事件,从事件名字都可以看出,它是在web容器初始化成功后会发出通知。说白了就是:nacos服务已经跑起来了,现在该初始化数据、加载缓存的各位都可以开始自己的表演了。。。 那么ServerMemberManager会在web服务初始化后做啥呢?
StandaloneMemberLookup
其实前面类图已经拆的七七八八了,但是还留了一些细节没有说,现在来重点将各个细节补充上!一共分为三部分:1. initAndStartLookup 到底在做什么 2. infoReportTask 到底在做什么 3. 集群成员变化后管理器到底怎么更新
我们的重点是ServerMemeberManager。那么看一个类首先应该看啥?当然是看构造器啦!一般我们先看看这个对象是怎么new出来的。 我们竟然看到一个 init();不用说,这个类不简单,你想想你在spring里面注入一个service的时候有写过 init 方法吗?很少吧~ 为啥?还不是因为你写的东西逻辑很简单 。。。 这个管理器逻辑很复杂,需要在注入的时候进行初始化,所以我们理所当然的看它是怎么初始化的!核心的就是下面三个步骤:1. 将自己加到集群列表中 2. 注册集群监听事件 3. 启动初始化寻址器
onApplicationEvent
实现
AddressServerMemberLookup
WatchService
第一个细节:initAndStartLookup 到底在做什么
last
作为一个分布式组件,集群的管理是一个必须要面对的问题,nacos的集群管理里面有一个非常重要的角色:`ServerMemberManager` 我们姑且叫它 `集群节点管理器`,负责整个集群的节点进进出出,还包括控制台的一套CRUD实现!此类的重要性不言而喻,搞懂这个类对我们理解nacos的集群管理和系统设计都有很大的帮助!整起来!!!<该类在2.0版本一共600行代码>
first
initAndStartLookup()lookup:我们翻译成人话就是寻址,nacos需要发现集群服务信息,等下详细说
realized
其实真的很简单。。。每隔两秒执行一次HTTP多播请求。这个很好理解啦,就是我们很熟悉keepAlive机制。每隔2s向集群中的其他节点上报一次自己的集群信息。地址是:/core/cluster/report 大家在 `NacosClusterController` 中又可以看到,nacos服务器接收到report请求后,再调用管理器去更新集群节点信息(每个管理器既发请求,又处理请求)
ServerMemberManager-1
registerClusterEvent()Nacos是事件驱动模型,这里监听节点改变事件,当有节点变化该管理器会更新
最后看看最右边的MemberLookup类图,这个很经典啦!接口、抽象类、实现类、加工厂类的模式。基本上所有的开源组件中都到处可见这种类结构。 1. 接口定义能干啥 2. 抽象方法实现通用的东西,并定义后人怎么扩展 3. 不同的子类各自实现自己的逻辑,完成扩展 4. 工厂统一提供各种实现对象的创造,方便使用。
ServerMemberManager
Part-1说在前
ApplicationListener<WebServerInitializedEvent>
看最下面,ServerMemberManager 组合了两个东西,一个是infoReportTask,另外一个是AsyncRestTemplate。而infoReportTask又组合了asyncRestTemplate,大概就能猜出来了。。。intoReportTask是一个要上报信息的任务,那么上报的方式就是asyncRestTemplate,通过异步的rest接口调用的方式。 还有一条线呢?可以看到ApplicationListener还有组合infoReportTask!这个想想就知道了,因为Task是一个线程类,就是在监听器中启动(run)的。。。
private void initAndStartLookup() throws NacosException { this.lookup = LookupFactory.createLookUp(this); this.lookup.start(); }直接看代码,内容很简洁哈。(省略不重要的代码)1. 首先通过工厂类创造一个寻址器(根据我们使用配置一共有三种)2. 启动寻址器,集群类型的寻址器都是线程类型的(FileConfig启动动作是run一个线程监听cluster.confg变化)(AddressServer启动动作是启动一个线程不停地http请求地址服务器)
then
MemberLookup
and
TIPS我个人是十分喜欢UML类图的!一些开源组件的设计其实是十分复杂的,说实话代码不是自己写的,可能每行代码都看的懂,但是放到一起你就不知道它到底是个啥玩意儿了。。。但是说到底这些复杂的逻辑还是要靠一个个的类对象组合来实现。所以遇到复杂的类,知道它大概干啥后,先画类图,帮助很大。甚至,我经常在画着画着的时候突然就懂了他的设计。。。各位道友大可一试!
第二个细节:infoReportTask 到底在做什么
目前,我们生产环境都是使用的cluster.conf 配置整个集群信息,当然nacos团队说日后会实现自动注册发现。 那么针对cluster.conf这种大家都在用的方式,更新很简单了,在集群管理器new出来后,就会读取cluster.conf里面的配置然后加载到自己的列表里面,然后再整个nacos服务器启动后,不停地对列表里面的其他节点多播上报集群信息,有不一致的就更新,没有启动的就标记下线,等启动后也会向其他节点上报信息,这样整个集群信息就同步管理起来了
0 条评论
下一页
为你推荐
查看更多