Dubbo源码分析(五)ExtensionLoader

ExtensionLoader是Dubbo中很有特色的一个设计,它的作用是为框架提供各种组件的扩展点,可以在应用运行时来决定使用哪个组件。对扩展点组件的描述是通过注解的方式实现的,包括3个主要的注解:

  • SPI
  • Adaptive
  • Activate

我们先从注解的含义来理解ExtensionLoader

SPI

SPI是一个很早就存在的概念,它是预先定义的一组接口,并允许各个厂商(使用方)有自己的实现,通过配置的方式在运行时决定使用哪种实现。我们可以看一下Dubbo中具有SPI标记的接口有哪些

  1. CacheFactory
  2. Compiler
  3. ExtensionFactory
  4. LoggerAdapter
  5. Serialization
  6. StatusChecker
  7. DataStore
  8. ThreadPool
  9. Container
  10. PageHandler
  11. MonitorFactory
  12. RegistryFactory
  13. ChannelHandler
  14. Codec
  15. Codec2
  16. Dispatcher
  17. Transporter
  18. Exchanger
  19. HttpBinder
  20. Networker
  21. TelnetHandler
  22. ZookeeperTransporter
  23. ExporterListener
  24. Filter
  25. InvokerListener
  26. Protocol
  27. ProxyFactory
  28. Cluster
  29. ConfiguratorFactory
  30. LoadBalance
  31. Merger
  32. RouterFactory
  33. RuleConverter
  34. ClassNameGenerator
  35. Validation

当我们需这些接口的实现类时,就可以通过ExtensionLoader的方法获取

其中第一个方法是拿到一个具体的实现类,第二个方法是拿到一组被激活的实现类。

Adaptive

这个词无论作为注解名还是get方法名都比较令人迷惑。Adaptive的本意是适配的,之所以这样命名是因为我们从getAdaptiveExtension()获取到的对象并不是某个真正的实现类,而是对实现类进行封装之后的一个适配器。当我们调用这个适配器的方法时,它会间接地去调用具体实现类的方法。而适配器中正包含了该选取何种实现方式的逻辑。

适配器类的定义有两种来源:

  1. 静态代码形式的默认适配器。这些类会被Adaptive注解修饰,且一个接口只能有一个这样的静态适配器。这种形式仅应用于一些特殊的接口,如:AdaptiveCompiler、AdaptiveExtensionFactory这两个适配器,ExtensionLoader需要依赖它们来工作,所以使用了这种特殊的构建方式。
  2. 动态代码适配器。实际上其余的接口都是使用动态适配器,ExtensionLoader根据接口定义动态生成一段适配器代码,并构建这个动态类的实例。这个时候接口中的一些方法具有Adaptive标记,它提供了一些用于查找具体Extension的key,如果这些方法中有URL类型的参数,则会依次在url中查找这些key对应的value,再以此为name确定要使用的Extension。如果没有从url中找到该参数,则会使用SPI注解中的默认值name进行构建。

Transporter

下面以Transporter接口为例进行说明

bind方法具有Adaptive标记,所以在生成动态Adapter类的时候,该方法会根据运行时的参数决定使用那个具体的实现类,以下是部分动态类的代码

在适配器的方法中,首先要确定具体实现类的类型,也就是extName。当方法中有URL类型的参数时,这个配置会从url参数中获取。Adaptive注解中的两个key即是在url查找的key,分别为server和transporter。当两个key都不存在时,使用SPI注解中得默认值netty。在确定了extName后,就可以从事先加载好的实例中获取extension对象,最终将方法的调用传递给extension的对应方法。

全部extName与实现类的对应关系配置在dubbo jar包中MET-INF/dubbo/internal下,Transporter对应的配置文件为

Activate

Activate标记适用于另外一种动态配置

一个接口有多个实现类,Activate标记在每个实现类的type上,并注明“何时被激活”的条件,如group和key的信息,以及在所有被激活实现类中的排序信息。通过ExtensionLoader的getActivateExtension可以获取到被激活实现类构成的List。下面以最重要的Filter接口进行说明

接口本身不再有Activate注解,而是在它的实现类上面,如TimeoutFilter

只有在group为provider时才会生效

MonitorFilter在provider和consumer两端都会生效。这里group、key等条件是通过getActivateExtension的方法参数确定的,group通常是预先设定好的,key可以直接指定,也可以动态由url参数决定。当url中包含特定的key(value可以是任意值)时,对应的实例就会被激活。

ExtensionLoader本身还有很多复杂的实现细节,这里就不再介绍了。感兴趣的读者可以翻阅源码深入研究一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值