Dubbo——扩展点加载机制

摘要

Dubbo良好的扩展性与两个方面是密不可分的,一是整个框架中针对不同的场景,恰到好处地使用了各种设计模式,二就是本章要介绍的加载机制。基于Dubbo SPI加载机制,让整个框架的接口和具体实现完全解耦,从而奠定了整个框架良好可扩展性的基础。Dubbo定义了良好框架结构,它默认提供了很多可以直接使用的扩展点。Dubbo几乎所的功能组件都是基于扩展机制〈SPI)实现的这些扩展点将在第8章核心扩展点中进行介绍。Dubbo SPI没有直接使用Java SPI,而是在它的思想上又做了一定的改进,形成了一套自己的配置规范和特性,同时,Dubbo SPI又兼容Java SPI。服务在启动的时候,Dubbo就会查找这些扩展点的所有实现,本章聚焦扩展机制的实现原理。

Java SPI

在讲解Dubbo SPI之前,我们先了解一下Java SPI是怎么使用的。SPI的全称是Service Provider Interface,起初是提供给厂商做插件开发的。Java SPI 使用了策略模式,一个接口多种实现。我们只声明接口,具体的实现并不在程序中直接确定,而是由程序之外的配置掌控,用于具体实现的装配。具体步骤如下:

  • (1)定义一个接口及对应的方法。
  • (2)编写该接口的一个实现类。
  • (3)在META-INF/services/目录下,创建一个以接口全路径命名的文件,如com.test.spi.PrintService。
  • (4)文件内容为具体实现类的全路径名,如果有多个,则用分行符分隔。
  • (5)在代码中通过java.util.ServiceLoader来加载具体的实现类。

Dubbo——扩展点加载机制_第1张图片

Dubbo——扩展点加载机制_第2张图片

扩展点加载机制的改进

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

如果扩展加载失败,则连扩展的名称都获取不到了。比如JDK标准的ScriptEngine,通过getName()获取脚本类型的名称,如果RubyScriptEngine因为所依赖的jruby.jar 不存在,导致RubyScriptEngine类加载失败,这个失败原因被“吃掉”了,和Ruby对应不起来,当用户执行Ruby脚本时,会报不支持Ruby,而不是真正失败的原因。

增加了对扩展loC和AOP的支持,一个扩展可以直接setter注入其他扩展。在Java SPl的使用示例章节(代码清单4-1)中已经看到,java.util.ServiceLoader会一次把PrintService接口下的所有实现类全部初始化,用户直接调用即可。Dubbo SPI只是加载配置文件中的类,并分成不同的种类缓存在内存中,而不会立即全部初始化,在性能上有更好的表现。具体的实现原理会在后面讲解,此处演示一个使用示例。我们把代码清单4-1中的 PrintService改造成Dubbo SPI的形式,如代码清单4-2所示。

Dubbo——扩展点加载机制_第3张图片

Java SPI加载失败,可能会因为各种原因导致异常信息被“吞掉”,导致开发人员问题追踪比较困难。Dubbo SPI 在扩展加载失败的时候会先抛出真实异常并打印日志。扩展点在被动加载的时候,即使有部分扩展加载失败也不会影响其他扩展点和整个框架的使用

Dubbo SPI自己实现了IoC和AOP机制。一个扩展点可以通过setter方法直接注入其他扩展的方法,TinjectExtension(Tinstance)方法实现了这个功能,后面会专门讲解。另外,Dubbo支持包装扩展类,推荐把通用的抽象逻辑放到包装类中,用于实现扩展点的AOP特性。举个例子,我们可以看到ProtocolFilterwrapper包装扩展了DubboProtocol类,一些通用的判断逻辑全部放在了ProtocolFilterwrapper类的export方法中,但最终会调用DubboProtocol#export方法。这和Spring的动态代理思想一样,在被代理类的前后插入自己的逻辑进行增强,最终调用被代理类。下面是ProtocolFilterwrapper#export方法,如代码清单4-3所示。

Dubbo——扩展点加载机制_第4张图片

扩展点的配置规范

Dubbo SPI和 Java SPI类似,需要在META-INF/dubbo/下放置对应的SPI配置文件,文件名称需要命名为接口的全路径名。配置文件的内容为key=扩展点实现类全路径名,如果有多个实现类则使用换行符分隔。其中,key 会作为 Dubbo SPI注解中的传入参数。另外,Dubbo SPI还兼容了Java SPI的配置路径和内容配置方式。在 Dubbo启动的时候,会默认扫这三个目录下的配置文件:META-INF/services/、META-INF/dubbo/、META-INF/dubbo/internal/,如表4-1所示。

Dubbo——扩展点加载机制_第5张图片

本章的对于目前本人理解还是有难度,因此对于这个内容我将后期的更新的这个的dubbo的理解和分析。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Dubbo,dubbo)