前提
Nacos 支持单机部署以及集群部署,针对单机模式,Nacos 只是自己和自己通信;对于集群模式,则集群内的每个 Nacos 成员都需要相互通信。因此这就带来⼀个问题,该以何种方式去管理集群内的 Nacos 成员节点信息,而这,就是 Nacos 内部的寻址机制。
设计
无论是单机模式,还是集群模式,其根本区别只是 Nacos 成员节点的个数是单个还是多个,并且,要能够感知到节点的变更情况:节点是增加了还是减少了;当前最新的成员列表信息是什么;以何种方式去管理成员列表信息;如何快速的支持新的、更优秀的成员列表管理模式等等。
针对上述需求点,我们抽象出了⼀个 MemberLookup 接口,具体设计如下:
public interface MemberLookup {
/**
* start.
*
* @throws NacosException NacosException
*/
void start() throws NacosException;
/**
* Inject the ServerMemberManager property.
*
* @param memberManager {@link ServerMemberManager}
*/
void injectMemberManager(ServerMemberManager memberManager);
/**
* The addressing pattern finds cluster nodes.
*
* @param members {@link Collection}
*/
void afterLookup(Collection<Member> members);
/**
* Addressing mode closed.
*
* @throws NacosException NacosException
*/
void destroy() throws NacosException;
}
(ServerMemberManager 存储着本节点所知道的所有成员节点列表信息,提供了针对成员节点的
增删改查操作,同时维护了⼀个MemberLookup 列表,方便进行动态切换成员节点寻址方式。)
可以看到,MemberLookup 接口非常简单,核心接口就两个—— injectMemberManager 以及
afterLookup ,前者用于将ServerMemberManager 注入到MemberLookup 中,方便利用
ServerMemberManager 的存储、查询能力,后者afterLookup 则是⼀个事件接口,当MemberL
ookup 需要进行成员节点信息更新时,会将当前最新的成员节点列表信息通过该函数进行通知给
ServerMemberManager,具体的节点管理方式,则是隐藏到具体的MemberLookup 实现中。