Dubbo概述--服务扩展及初始化

Dubbo–服务扩展及初始化

写在前面

本文参考了Dubbo官方手册结合Dubbo2.6.1版本源码分析。推荐先阅读官方手册

鉴于个人水平有限,如有不正确的地方请指出,欢迎一起讨论,谢谢!

服务扩展

Dubbo使用类似于SPI的方式进行服务扩展管理,从大量服务提供接口中选择实际提供服务的接口,并根据配置对服务添加配置包装类(第5步)。大致流程如下:

  1. 向ExtensionLoader类的getExtensionLoader方法传入的class类型对象,此对象必须是接口类型,必须有SPI注解
  2. ExtensionLoader根据类型优先从缓存(包括缓存的活动服务、缓存的所有服务类)中获取class对象的服务提供类,获取到后直接返回缓存的服务提供类。
  3. 如果无缓存则加载META-INF/dubbo/internal/、META-INF/dubbo/、META-INF/services/三个目录下以class对象名为名的文件,从文件中获取所有服务提供类(服务提供类必须是getExtensionLoader方法传入的class类型对象的实现类)。从此步骤开始,都是线程安全的。
  4. 从所有的服务类中获取有Adaptive注解的类作为实际服务提供类(多个同类型的服务提供类只能有一个类有Adaptive注解,否则会报错)。
  5. 服务类中包含有接口参数构造方法(如ProtocolListenerWrapper(Protocol protocol))的服务类作为Wrapper类处理,Wrapper类会在后续根据名称获取实际服务类时(获取默认类getAdaptiveExtension时不会包装)包装实际服务类,即返回的始终是Wrapper类。如果有多个Wrapper类,则使用最后加载Wapper类作为最外层包装(装饰器模式)。
  6. 对于带有类注解Activate的服务类缓存到cachedActivates中,供后续的getActivateExtension方法使用。
  7. 如果配置文件中未包含有Adaptive注解的服务提供类,则动态创建一个类名为class类$Adaptive实现class接口的服务提供类作为实际服务提供类,并编译此类。
    • 此处要求class对象对应的接口中必须包含有带Adaptive注解的方法
    • 动态创建的类只会实现带Adaptive注解的方法。
    • 动态创建类的方法会根据Adaptive注解优先使用URL中的同名参数值,默认使用class接口SPI注解中的value值从ExtensionLoader中查找对应的服务实现类。
    • 当Adaptive注解有多个URL参数时,右侧优先嵌套获取。
  8. 无论是动态创建的类还是扩展服务类在构建时会根据set方法注入其他扩展服务实现(ExtensionLoader.injectExtension实现)。

综上,Dobbo本身的服务扩展会默认使用自身注解代表的服务提供类,对于非动态生成类则优先使用Adaptive注解修饰的类,对于动态生成类则一般优先使用Adaptive注解中参数名对应的URL参数值指代的类。

初始化过程

Dubbo初始化的过程就是通过自身扩展的命名空间以及相应BeanDefinitionParser接口的实现类,在Spring初始化时将配置中的标签转化为固定类型的BeanDefinition。同时,在BeanDefinition生成Spring Bean时,通过服务扩展将声明在各个jar包中的默认服务类组装到实际使用类中建议参阅Spring扩展及初始化分析。大致过程如下:

  1. 根据标签,设置BeanDefinition具体的bean类型
  2. 设置BeanDefinition的默认属性:非懒加载
  3. 根据标签属性(id、name、interface等)设置BeanDefinition的PropertyValues中id属性名的属性值
  4. 如果是协议配置类,则将所有属性名为protocol的属性值设置为引用类型,且引用为BeanDefinition
  5. 如果是服务提供类且是通过class属性声明服务,则将class属性指向的类注册为BeanDefinition,同时将服务提供类的ref属性设置为class属性实例
  6. 如果是提供者或者消费者配置,则嵌套解析其内部的声明
  7. 获取同时存在于bean中getter/setter方法的后缀,认为其为类属性名,通过解析声明向BeanDefinition的PropertyValues中添加属性名以及其属性值
  8. BeanDefinition在实例化时,根据内部对ExtensionLoader的调用,将实际服务提供类注入到各个类中。或者根据属性名将其他的配置Bean注入到当前Bean。

一级标签说明

标签 实现类 解释
<dubbo:application/> ApplicationConfig 定义应用信息,包括应用名称等信息。可以重复。
<dubbo:module/> ModuleConfig 用于配置当前模块信息,可选。与Application无从属关系。可能通过organization与Application关联。
<dubbo:registry/> RegistryConfig 用于配置连接注册中心相关信息,包括地址、协议名、认证信息等。
<dubbo:monitor/> MonitorConfig 用于配置连接监控中心相关信息,可选。
<dubbo:provider/> ProviderConfig 服务提供者的默认配置信息,优先级低于具体配置类的自身配置值。可选。
<dubbo:consumer/> ConsumerConfig 服务消费者的默认配置信息,优先级低于具体配置类的自身配置值。可选。
<dubbo:protocol/> ProtocolConfig 用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受
<dubbo:service/> ServiceBean 用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。每一个URL代表一个唯一的ServiceBean。
<dubbo:reference/> ReferenceBean 用于创建一个远程服务代理,一个引用可以指向多个注册中心
<dubbo:annotation/> 方法配置 用于处理类中的注解

猜你喜欢

转载自blog.csdn.net/woshismyawei/article/details/80016292