首页 > 编程语言 > 详细

从Spring容器的角度理解Dubbo扩展点的加载

时间:2021-07-21 09:20:46      阅读:27      评论:0      收藏:0      [点我收藏+]

  通过前面介绍Dubbo中的SPI及其自适应的文章中,示例案例中自定义了扩展接口而不是使用Dubbo已提供的扩展接口。在案例中,主程序分别使用了不同的加载方法,如下:

  技术分享图片

   技术分享图片

   技术分享图片

  从ExtensionLoader扩展点加载类注释分析:

    技术分享图片

   图中红框中的三个类是配合使用,如果在单进程中存在多dubbo服务应用是需要同时重构这三个类的。同时dubbo扩展点加载要点如下:

    1、自动注入依赖的扩展点(springframewok);

    2、在包装器中自动包装扩展点;

    3、默认扩展需是一个自适应的实例。

   而对于Dubbo提供的扩展点,主程序执行的过程中并没有显示调用加载的过程,无论是自激活的Filter还是自适应的ThreadPool。那么这样的扩展点在程序运行的哪个节点调用的呢?

  之前文章中Dubbo中SPI对JDK标准的SPI的一个改进就是:

    技术分享图片

   这个改进点如何体现的呢?通过对dubbo提供的已有的扩展点的使用,即主程序执行的过程中并没有显示调用加载的过程就是通过对spring IOC和AOP的支持解决了。之前文章中自定义filter/threadpool的使用可以验证:

  技术分享图片

   技术分享图片

   以该文章中关于线程池的扩展点为例,调试分析dubbo扩展点的加载原理。首先看注解版的配置(以服务端为例,那么调用的是自适应的扩展点threadpool):

    查看配置类:

      技术分享图片

     红框中是典型的Java Bean 的一个应用,就是将扫描目录下的bean和一个RegistryConfig实例化注入到容器中。关于此部分的内容,参考Spring Bean加载全过程相关的内容(Spring Bean加载全过程(注解配置) - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com))。

  上述配置与扩展点唯一的关联在于配置文件dubbo-provider.properties中,关于线程池配属性的配置:

    技术分享图片

   参考Spring Bean的加载,可知该配置保存到数据结构ProviderConfig中:

    技术分享图片

  那么本文就以watching这个扩展点为切入点阐述扩展点的识别、加载、应用的全过程。

 技术分享图片

    根据上面跟踪调试信息,可知watching扩展点的调用在Spring容器初始化完成刷新的过程中调用事件。关于Spring事件的应用,在之前的文章中有涉及可以参考(从命令模式的维度理解Spring 之Application Event - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)),本文略述:  

    技术分享图片

  从跟踪截图上看,listener为DubboBootstrapApplicationListener,ApplicationContextAwareProcessor后置处理DubboApplicationListenerRegistrar时setApplicationContext中添加到容器中专门保存listener的列表中

    技术分享图片

  后续关于Event的使用就不赘述了。那么扩展点的加载了,到目前为止还没有涉及;以上都是为Event的publish/listener做准备,下面就是本文的重点扩展点了:

    1、事件发布后,事件派发器派发事件给listener    

       技术分享图片

       技术分享图片

     2、listener响应事件

      技术分享图片

       技术分享图片

     3、dubboBootstrap.start命令中获取扩展点,URL中就包含了扩展点的名字。

      技术分享图片

  通过以上阐述,dubbo中扩展点的加载时机就非常明确了。

从Spring容器的角度理解Dubbo扩展点的加载

原文:https://www.cnblogs.com/ilovebath/p/14916539.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!