Dubbo SPI的认识

2021-12-23 17:54:29 浏览数 (1)

Dubbo中,SPI是一个非常核心的机制,贯穿在几乎所有的流程中。

Dubbo是基于Java原生SPI机制思想的一个改进.

关于JAVA 的SPI机制

SPI全称(service provider interface),是JDK内置的一种服务提供发现机制,目前市面上有很多框架都是用它来做服务的扩展发现,大家耳熟能详的如JDBC、日志框架都有用到; 简单来说,它是一种动态替换发现的机制。举个简单的例子,如果我们定义了一个规范,需要第三方厂商去实现,那么对于我们应用方来说,只需要集成对应厂商的插件,既可以完成对应规范的实现机制。 形成一种插拔式的扩展手段。

SPI规范总结

实现SPI,就需要按照SPI本身定义的规范来进行配置,SPI规范如下

  • 1.需要在classpath下创建一个目录,该目录命名必须是:META-INF/services
  • 2.在该目录下创建一个properties文件,该文件需要满足以下几个条件
    • a)文件名必须是扩展的接口的全路径名称
    • b)文件内部描述的是该扩展接口的所有实现类
    • c)文件的编码格式是UTF-8
  • 3.通过java.util.ServiceLoader的加载机制来发现
SPI的缺点
  1. JDK标准的SPI会一次性加载实例化扩展点的所有实现,什么意思呢?就是如果你在META-INF/service下的文件里面加了N个实现类,那么JDK启动的时候都会一次性全部加载。那么如果有的扩展点实现初始化很耗时或者如果有些实现类并没有用到,那么会很浪费资源
  2. 如果扩展点加载失败,会导致调用方报错,而且这个错误很难定位到是这个原因
Dubbo优化后的SPI实现

基于Dubbo提供的SPI规范实现自己的扩展 在了解Dubbo的SPI机制之前,先通过一段代码初步了解Dubbo的实现方式,这样,我们就能够形成一个对比,得到这两种实现方式的差异

0 人点赞