无名 发表于 2022-5-8 18:40:51

【HC】【考核】Dubbo 源码解析(2)


服务目录目前内置的实现有两个

StaticDirectory
RegistryDirectory
它们均是 AbstractDirectory 的子类。
AbstractDirectory 实现了 Directory 接口,这个接口包含了一个重要的方法定义,即 list(Invocation),用于列举 Invoker。
下面我们来看一下他们的继承体系图

Directory 代表多个 Invoker,可以把它看成 List ,但与 List 不同的是,它的值可能是动态变化的,比如注册中心推送变更

第三种则是有看过源码的,其实从StaticDirectory中的Static关键词来看,就知道,这个其实是不会动态变化的,从下图知道,他的Invoker是通过构造函数传入,StaticDirectory用得比较少,主要用在服务对多注册中心的引用

继承体系http://cdn.u1.huluxia.com/g3/M02/38/0A/wKgBOV3ImA6AR_ePAAI0ALptO3k848.jpg
Directory 继承自 Node 接口,Node 这个接口继承者比较多,像

Registry
Monitor
Invoker
… 等
均继承了这个接口
这个接口包含了一个获取配置信息的方法 getUrl,实现该接口的类可以向外提供配置信息

RegistryDirectory 实现了 NotifyListener 接口,当注册中心节点信息发生变化后,RegistryDirectory 可以通过此接口方法得到变更信息,并根据变更信息动态调整内部 Invoker 列表。
这个NotifyListener中的notify方法就是注册中心的回调,也就是它能根据注册中心动态变化的根源.

下面放一个上篇中集群容错的整体架构中的一个图唤醒大家的对Directory记忆

从中可以看出,Directory获取invoker是从methodInvokerMap中获取的,从这个图也可以看出,这些主要都是读操作,那它的写操作是在什么时候写的呢?就是在回调方法notify的时候操作的

也就是注册中心有变化,则更新methodInvokerMap和urlInvokerMap的值(这个后面讲服务引用原理的时候会再提一下),这就是官网提到的它的值可能是动态变化的,比如注册中心推送变更的原因所在.

3

本章将分析 AbstractDirectory 和它两个子类的源码。AbstractDirectory 封装了 Invoker 列举流程,具体的列举逻辑则由子类实现,这是典型的模板模式
接下来我们先来看一下 AbstractDirectory 的源码。http://cdn.u1.huluxia.com/g3/M01/38/0F/wKgBOV3Ins-AF75VAAFAIevZ-vc193.jpg
页: [1]
查看完整版本: 【HC】【考核】Dubbo 源码解析(2)