在Dubbo3中,RegistryDirectory的创建过程及其在消费者动态更新提供者和路由信息,以及消费者发起调用时的Invoker列表过滤过程
2023-10-07 14:59:25
引言
在分布式系统中,服务发现和调用是一个至关重要的环节。Dubbo作为一款成熟的分布式服务框架,提供了高效可靠的服务注册和发现机制。RegistryDirectory作为Dubbo3中服务注册表的核心组件,负责管理服务提供者和路由信息,并动态更新这些信息,以便消费者能够及时获取最新的服务提供者列表。本文将深入剖析RegistryDirectory的创建过程、动态更新提供者和路由信息的方式,以及消费者在发起调用时如何从RouterChain中过滤Invoker列表。
RegistryDirectory的创建过程
RegistryDirectory的创建过程主要涉及三个步骤:
- 初始化 :当消费者启动时,它将根据配置的注册中心地址,创建RegistryDirectory实例。
- 订阅 :RegistryDirectory会向注册中心订阅服务提供者列表和路由信息。
- 注册监听器 :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的服务治理起着至关重要的作用。