Dubbo笔记



简介

以下是笔记学习Dubbo的相关笔记。

Dubbo管理容器

Dubbo管理容器主要分为反转控制和动态扩展容器的两大功能。

反转控制其实和Spring思路大致相同,这里虽然有重复造轮子的嫌疑,但Spring的实现还是相当冗余的,而Dubbo的实现逻辑只有区区一个ExtensionLoader类,还是很值得阅读源码并研究的。

每一个ExtensionLoader实例对应每一个接口类型,首次获取某个接口类型就会初始化ExtensionLoader。

相关注解

有三个比较重要的注解,分别是@SPI、@Adaptive和@Activate。

@SPI

服务提供接口注解标志,作用于接口上,注解的value值表示默认的提供服务类。意图是为了通过接口名字加载服务提供接口的资源。

@Adaptive

自适应服务提供接口注解,作用于具体类或者接口方法上。意图是实现动态加载服务提供类。

  1. 当作用于具体类时,目前只有AdaptiveCompiler和AdaptiveExtensionFactory,即具体类实现接口方法,而不依赖url。
  2. 当作用于接口方法时,注解的value表示根据url的key获取对应的值,并动态加载key对应值的服务提供类。

@Activate

自激活扩展注解标志,作用于具体类上,意图是实现服务调用的链路增强。

注解的value值为可选项,没有则自动激活扩展。有则需要匹配url的key和value,动态开启扩展。还有before、after和order这些决定调用链路顺序的可选属性值。

获取容器步骤

ExtensionLoader有三种获取容器的方法分别是getExtension、getAdaptiveExtension和getActivateExtension。无论是哪一种方法都需要:

  1. 初始化对应接口的ExtensionLoader实例;
  2. 通过项目路径下resources.META-INF对应路径下,加载以接口为全名的文件(若是Protocol接口,文件名则是com.alibaba.dubbo.common.extension.Protocol),解析文件对应的kv值,并解析v对应的服务提供类;

步骤1初始化ExtensionLoader实例的时候,会对成员变量

步骤2过程中会给ExtensionLoader的成员变量赋值,列举几个重要的成员变量。

  1. 抽象工厂
  2. 代理
  3. 装饰
  4. 单例
  5. 责任链
  6. 观察者
  7. 模板

PlantUML SVG diagram

有空再写……