Dubbo 学习之路
读一本好书,就是在和高尚的人谈话。——歌德
Dubbo 源码学习 Directory
通过Directory
服务消费者可获取到服务提供者的信息,比如 ip、端口、服务协议等。有了服务提供列表信息,服务消费者会根据负载均衡算法
选择一个具体的服务提供者,发起远程调用。
另一方面服务提供者集群可能会发生动态变化,服务消费者需要能够感知这些变化,动态调整服务提供者列表。
Directory 接口
public interface Directory<T> extends Node {
/**
* get service type.
*
* @return service type.
*/
Class<T> getInterface();
/**
* list invokers.
*
* @return invokers
*/
List<Invoker<T>> list(Invocation invocation) throws RpcException;
List<Invoker<T>> getAllInvokers();
URL getConsumerUrl();
}
其中最重要的方法list(Invocation invocation)
返回目录下Invokers。
Directory 有两个实现类StaticDirectory
和 RegistryDirectory
RegistryDirectory
RegistryDirectory 实现了 NotifyListener , 即具有监听注册中心变化,动态更新服务提供者列表功能。
具体发送调用subscribe(URL url) 参考之前文章 Dubbo 源码学习 | 消费端引用梳理 RegistryProtocol.doRefer相关分析
RegistryDirectory notify
触发invoker列表更新
refreshOverrideAndInvoke
方法会根据注册中心最新的服务提供者url 信息 ,刷新invokers。这里的刷新包含添加新的invoker ,关闭旧的中多余的Invoker 。
StaticDirectory
如果是多注册中心情况,所有注册中心的 invokers 汇总成 StaticDirectory,这里有点类似适配器模式,将多注册中心情况与单注册中心情况进行了同一,Directory 需要配置Cluster 使用。
Cluster join(Directorydirectory) 方法将Directory 中invokers 伪装成一个 virtual invoker。
(参考之前文章 Dubbo 源码学习 | 消费端引用梳理)
总结
Directory是Dubbo集群容错、负载均衡的基础,集群容错与负载均衡建立在多个服务提供者基础上,而Directory作用就是提供服务提供者列表。