dubbo学习之路-SPI机制

时间:2021-03-19 19:45:17

dubbo学习之路-SPI机制

1.SPI

  1.1Java SPI 原理

  SPI是service provider interface简称。在java JDK中 内置的一种服务提供发现机制。它解决在一个框架中动态发现替换服务。常见的如:jdbc、日志框架等。

  Java SPI 的实现原理: 

1. 需要在 classpath 下创建一个目录,该目录命名必须是:META-INF/service
2. 在该目录下创建一个 properties 文件,该文件需要满足以下几个条件 
2.1 文件名必须是扩展的接口的全路径名称
2.2 文件内部描述的是该扩展接口的所有实现类
2.3 文件的编码格式是 UTF-8
3. 通过 java.util.ServiceLoader 的加载机制来发现

1.2 代码演示

  在服务中定义一个接口  

//组装车
public interface AssembleCar {
//工艺步骤
void processingStep();
}

  实现类

public class AssembleCarPartOne implements  AssembleCar {
@Override
public void processingStep() {
System.out.println("part one processing step");
}
}
public class AssembleCarPartTwo implements  AssembleCar {
@Override
public void processingStep() {
System.out.println("part two processing step");
}
}

classpath 下创建一个目录,该目录命名必须是:META-INF/service

文件名必须是扩展的接口的全路径名称

文件内部描述的是该扩展接口的所有实现类

dubbo学习之路-SPI机制

java.util.ServiceLoader 的加载机制来发现

@SpringBootApplication
public class ClientspiApplication { public static void main(String[] args) { new SpringApplicationBuilder()
.sources(ClientspiApplication.class)
.bannerMode(Banner.Mode.OFF)//关闭springboot 图标
.web(WebApplicationType.NONE)//不作为web服务启动
.run(args);//运行 //java SPI加载服务
ServiceLoader<AssembleCar> services = ServiceLoader.load(AssembleCar.class);
for (AssembleCar d:services){
d.processingStep(); }
}
}

运行结果:

dubbo学习之路-SPI机制

1.3 java SPI 的不足

1. JDK 标准的 SPI 会一次性加载实例化扩展点的所有实现,什么意思呢?就是如果你在 META-INF/service 下的文件里面加了 N个实现类,那么 JDK 启动的时候都会一次性全部加载。那么如果有的扩展点实现初始化很耗时或者如果有些实现类并没有用到,那么会很浪费资源
2. 如果扩展点加载失败,会导致调用方报错,而且这个错误很难定位到是这个原因 

2. Dubbo 框架下的SPI