返回

在Dubbo3中,RegistryDirectory的创建过程及其在消费者动态更新提供者和路由信息,以及消费者发起调用时的Invoker列表过滤过程

后端

引言

在分布式系统中,服务发现和调用是一个至关重要的环节。Dubbo作为一款成熟的分布式服务框架,提供了高效可靠的服务注册和发现机制。RegistryDirectory作为Dubbo3中服务注册表的核心组件,负责管理服务提供者和路由信息,并动态更新这些信息,以便消费者能够及时获取最新的服务提供者列表。本文将深入剖析RegistryDirectory的创建过程、动态更新提供者和路由信息的方式,以及消费者在发起调用时如何从RouterChain中过滤Invoker列表。

RegistryDirectory的创建过程

RegistryDirectory的创建过程主要涉及三个步骤:

  1. 初始化 :当消费者启动时,它将根据配置的注册中心地址,创建RegistryDirectory实例。
  2. 订阅 :RegistryDirectory会向注册中心订阅服务提供者列表和路由信息。
  3. 注册监听器 :RegistryDirectory会注册监听器,以便在服务提供者列表或路由信息发生变更时收到通知。

以下代码示例展示了RegistryDirectory的创建过程:

public RegistryDirectory(ApplicationModel applicationModel, ModuleServiceResolver resolver) {
    this.applicationModel = applicationModel;
    this.resolver = resolver;
}

@Override
public void initialize() throws IllegalStateException {
    // 初始化注册中心连接
    initRegistries();
    // 订阅服务提供者列表
    subscribe(toRegisterContext());
    // 注册监听器
    registrars.values().forEach(registryDirectoryRegistrar -> registryDirectoryRegistrar.register(this));
}

动态更新提供者和路由信息

RegistryDirectory会动态更新服务提供者列表和路由信息,以确保消费者能够及时获取最新的服务提供者信息。当注册中心检测到服务提供者列表或路由信息发生变更时,它会通知RegistryDirectory。RegistryDirectory收到变更通知后,会更新本地缓存的服务提供者列表和路由信息。

以下代码示例展示了RegistryDirectory动态更新提供者和路由信息的过程:

@Override
public void notify(ServiceInstanceRegistration event) {
    if (isDiscovered() && applicationModel.getEnvironment().getCurrentApplication().equalsIgnoreCase(event.getServiceName())) {
        doOverrideIfNecessary(event);
    }

    RegistryDirectoryChangedEvent changedEvent = createRegistryDirectoryChangedEvent(event);
    notifyListeners(changedEvent);

    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Notify registry directory changed event: " + changedEvent);
    }
}

消费者发起调用时的Invoker列表过滤

当消费者发起调用时,它需要从RegistryDirectory中获取可用的服务提供者列表。RegistryDirectory会根据路由规则,过滤掉不可用的服务提供者,并返回可用的服务提供者列表。

以下代码示例展示了消费者发起调用时的Invoker列表过滤过程:

public List<Invoker> list(Invocation invocation) throws RpcException {
    List<Invoker> invokers = new ArrayList<>(routerChain.route(getInvokers(), invocation));
    return invokers;
}

总结

RegistryDirectory是Dubbo3中服务注册表的核心组件,负责管理服务提供者列表和路由信息,并动态更新这些信息。消费者在发起调用时,会从RegistryDirectory中获取可用的服务提供者列表,并根据路由规则过滤掉不可用的服务提供者。RegistryDirectory的创建过程、动态更新提供者和路由信息的方式,以及消费者在发起调用时的Invoker列表过滤过程,都对Dubbo3的服务治理起着至关重要的作用。