6
Dubbo扩展点加载机制
Dubbo良好的扩展性来自两个方面,一是针对不同的场景,采用恰当的设计模式,二是基于DubboSPI加载机制让整个框架的接口和具体实现完全解耦。
一、加载机制概述
DubboSPI在JavaSPI的思想上进行了改进,DubboSPI能够兼容JavaSPI,在启动时,Dubbo会查找扩展点的所有实现。
1. Java SPI
JavaSPI (Service Provider Interface) 是由JDK官方提供的用于厂商开发插件的加载机制,具体实现流程如下:
- 创建需要实现的接口
- 编写接口的实现类
- 在META-INF/services/目录下创建相关配置文件
- 在代码中通过java.util.ServiceLoader加载具体的实现类
*通过SPI加载机制,可以在程序中获取相应接口的由配置文件指定的实现
2. Dubbo SPI
DubboSPI相比JavaSPI有很多改进,解决了一些问题
- 支持选择性加载扩展点(JavaSPI是全部加载)
- 加载失败会抛出异常(JavaSPI的加载失败异常可能被吞掉)
- 实现了IOC和AOP机制,支持扩展点的依赖注入
配置规范
- 在META-INF/dubbo/路径下放置对应的配置文件(配置文件中可以设置扩展点别名)
- 采用DubboSPI注解规定SPI的接口,注解参数为配置文件中的别名
- DubboSPI还兼容JavaSPI
- Dubbo启动时默认扫描 META-INF/services/、META-INF/dubbo/、META-INF/dubbo/internal/ 三个目录
3.扩展点的分类与缓存
由缓存类型可以分为两种
- Class缓存
- 实例缓存
根据缓存类的种类分为四种
- 普通扩展类
- 包装扩展类(Wrapper)
- 自适应扩展类(Adaptive)
- 其他缓存
4.扩展点的特性
- 自动包装(装饰器模式)
- 自动加载
- 自适应(通过URL动态指定扩展点的具体实现类,采用@Adaptive实现类)
- 自动激活
参考
- 深入理解 Apache Dubbo 与实战