Dubbo-简述SPI机制

107 阅读1分钟

一、什么是SPI机制?

SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,SPI是一种动态替换发现的机制,一种解耦非常优秀的思想。

1.1 SPI的工作原理

SPI的工作原理:classpath路径下MATE-INF/services文件夹中,以接口的全限定名来命名文件,文件里面写该接口的实现。然后以资源加载的方式,读取文件的内容(接口实现的全限定名),再去加载类。

SPI可以很灵活的让接口和实现分离,让API提供者只提供接口,第三方来实现。

二、Dubbo的SPI机制

2.1 Dubbo的SPI机制

Dubbo的SPI机制的具体实现与使用的protocol相关,不同的协议找不同的实现类。

Dubbo的SPI源码流程如下:

20230817-140233.jpg

与JDK的SPI不同的是,Dubbo的SPI机制寻找的文件有三个地方:

  • META-INF/services/
  • META-INF/dubbo/
  • META-INF/dubbo/internal/

2.2 为什么Dubbo不用JDK的SPI,而是要自己实现?

JDK SPI的缺点:

  1. 会遍历所有实现并实例化,假设一个实现类初始化过程比较消耗资源且耗时,但是你的代码里面又用不上它,这就产生了资源的浪费,也无法准确引用。
  2. 没有使用缓存,每次load都要重载加载。

Dubbo SPI的优点:

  1. 给每个实现类配了个名字,通过名字去文件里面找到对应的实现类全限定名,然后加载实例化,按需加载
  2. 增加了缓存存储实例,提高读取性能。
  3. 提供了对IOC和AOP等高级功能的支持,以实现更多类型的扩展