dubbo 扩展 java SPI

一、描述

  dubbo中 SPI 是从 JDK 标准的 SPI 扩展点发现机制加强而来,详见官方文档说明:https://dubbo.apache.org/zh/docs/concepts/extensibility

二、改进了JDK 标准的 SPI 问题

  1.浪费资源:JDK 标准的 SPI 会一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源。

  2.失败原因不对应:如果扩展点加载失败,连扩展点的名称都拿不到了。比如:JDK 标准的 ScriptEngine,通过 getName() 获取脚本类型的名称,

    但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败原因被吃掉了,和 ruby 对应不起来,当

    用户执行 ruby 脚本时,会报不支持 ruby,而不是真正失败的原因。

三、Dubbo 扩展能力的特性

  1.按需加载。Dubbo 的扩展能力不会一次性实例化所有实现,而是用那个扩展类则实例化那个扩展类,减少资源浪费。

  2.增加扩展类的 IOC 能力。Dubbo 的扩展能力并不仅仅只是发现扩展服务实现类,而是在此基础上更进一步,如果该扩展类的属性依赖其他对象,则

     Dubbo 会自动的完成该依赖对象的注入功能。

  3.增加扩展类的 AOP 能力。Dubbo 扩展能力会自动的发现扩展类的包装类,完成包装类的构造,增强扩展类的功能。

  4.具备动态选择扩展实现的能力。Dubbo 扩展会基于参数,在运行时动态选择对应的扩展类,提高了 Dubbo 的扩展能力。

  5.可以对扩展实现进行排序。能够基于用户需求,指定扩展实现的执行顺序。

  6.提供扩展点的 Adaptive 能力。该能力可以使的一些扩展类在 consumer 端生效,一些扩展类在 provider 端生效。

四、Dubbo 扩展加载流程

  Dubbo 加载扩展的整个流程如下:

  主要步骤为 4 个:

    1.读取并解析配置文件

    2.缓存所有扩展实现

    3.基于用户执行的扩展名,实例化对应的扩展实现

    4.进行扩展实例属性的 IOC 注入以及实例化扩展的包装类,实现 AOP 特性



posted @ 2022-03-16 16:55  meow_world  阅读(28)  评论(0)    收藏  举报