Nacos注册中心设计分析-客户端

本文深入分析Nacos客户端的功能,包括服务实例的注册、摘除、订阅和取消订阅,以及心跳线程、服务实例变更通知线程等关键组件的工作原理。详细阐述了客户端初始化过程和重要数据结构,如EventDispatcher、NameProxy、BeatReactor和HostReactor,揭示了Nacos如何确保服务发现的高可用性。
摘要由CSDN通过智能技术生成

主要功能

Nacos客户端主要具有如下能力

  1. 服务实例注册:把服务实例信息写入注册中心,可通过注册中心查找提供服务的相关实例(NacosNamingService中registerInstance的实现)
  2. 服务实例摘除:把服务实例信息从注册中心移除(NacosNamingService中deregisterInstance的实现)
  3. 服务订阅:按照服务从注册中心订阅实例信息,如果注册中心中服务实例数据发生变化,则会通知客户端,调用相关监听器(EventListener)进行相关变更(NacosNamingService中subscribe的实现)
  4. 取消订阅:取消对某个服务的订阅(NacosNamingService中unsubscribe的实现)
  5. 获取服务实例:根据服务名从服务端获取实例,并跟踪该服务实例的变更(NacosNamingService中getAllInstances的实现)

比较“3.服务订阅”和“5.获取服务实例”,区别在于,“3.服务订阅”不仅跟踪了服务实例的变更,而且还要调用相关的监听器;而“5.获取服务实例”只跟踪服务实例的变更。

另外,需要注意的是,Nacos中的服务注册数据被设计为五层结构,包括Namespace、Group、Service、Cluster、Instance,其中Namespace和Group两层由客户端从应用配置中读取,达到应用隔离的目的,客户端注册和订阅实例的范围在Service及以下。

客户端初始化

客户端初始化主要完成如下工作

  • 初始化服务实例变更通知调度器(EventDispatcher):启动服务实例变更通知线程,监控Nacos服务器发送到客户端的服务实例变更事件,更新客户端的服务实例数据,并维护应用定制开发的监听器,通过监听器执行相关变更
  • 初始化服务器代理(ServerProxy):维护Nacos集群服务器信息,并启动两个定时线程,一个线程查询Nacos集群中的服务器列表,如果有变化,则更新客户端数据;另一个线程不断登录Nacos服务器,保证客户端的合法性
  • 初始化心跳反应器(BeatReactor):客户端初始化时,不会启动心跳线程,客户端完成注册服务实例之后,启动一个心跳线程,不断发送心跳信息到Nacos服务端,Nacos服务端检查该实例已注册则返回成功响应信息,如果Nacos返回不成功,则会重新注册该实例,达到补偿注册实例的效果
  • 初始化服务实例反应器(HostReactor):维护服务实例信息,并启动三个失败还原相关的线程和一个服务推送信息接收线程。在三个失败还原相关线程中,第一个线程在客户端初始化时检查失败还原目录是否为空,如果为空则立即把当前服务实例信息写入磁盘,第二个线程定时刷新失败还原的开关信息;第三个线程定时把当前的服务实例信息写入磁盘;另外,服务推送信息接收的线程循环读取从Nacos服务器推送过来的信息服务实例,如果接收到了信息,就会以共享内存的形式触发服务实例变更通知器
  • 获取服务器地址、服务器API路径、本地缓存文件地址、日志文件名称等
    Nacos客户端初始化代码如下,本文引用的代码都是1.2.0版本
private void init(Properties properties) {
   
        namespace = InitUtils.initNamespaceForNaming(properties);
        // 把构造函数的服务器地址赋值给内部对象
        initServerAddr(properties); 
        // 获取服务器API路径
        InitUtils.initWebRootContext();
        // 获取本地缓存地址
        initCacheDir();
        // 获取日志文件名称
        initLogName(properties);
        // 服务实例变更通知器
        eventDispatcher = new EventDispatcher(); 
        // 服务器代理
        serverProxy = new NamingProxy(namespace, endpoint, serverList, properties); 
        // 心跳反应器
        beatReactor = new BeatReactor(serverProxy, initClientBeatThreadCount(properties)); 
        // 实例反应器
        hostReactor = new HostReactor(eventDispatcher, serverProxy, cacheDir, isLoadCacheAtStart(properties),
            initPollingThreadCount(properties));
    }

重要数据结构

EventDispatcher

// EventDispatcher
public class EventDispatcher {
   
    .....
    // 变更的服务信息,共享内存,用于通知服务变更事件
    private BlockingQueue<ServiceInfo> changedServices = new LinkedBlockingQueue<ServiceInfo>();
    // Service对应的监听器
    private ConcurrentMap<String, List<EventListener>> observerMap
        = new ConcurrentHashMap<String, List<EventListener>>(); 
    ......
}

如上,changedServices是一个共享内存,用于服务事件变更通知;observerMap用于存放应用定义的监听器,key是服务标识,value是监听器列表

NameProxy

// NameProxy
public class NamingProxy {
   
    .....
    private List<String> serverList; 
    ......
}

如上,serverList是Nacos集群服务器列表

BeatReactor

// BeatReactor
public class BeatReactor {
   
    .....
    public final Map<String, BeatInfo> dom2Beat = 
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值