概述
一、spi是啥
spi是啥?dubbo的spi是怎么实现的?
spi简单来说就是Service Provider Interface。说明了是什么意思呢?比如说你有个接口,现在这个接口有3个实现类。那么在系统运行的时候,这个接口到底选择哪个实现类呢?这就需要SPI啦。需要根据指定的配置或者默认的配置,去找到对应的实现类加载进来。然后用这个实现类的实例对象。
接口A——>实现A1,实现A2,实现A3。我们配置一下让接口A实现A2。在系统运行的时候,会加载你的配置,用实现A2实例化一个对象来提供服务。
spi机制一般说用在哪呢?插件扩展的场景。比如说你开发的是一个给别人使用的开源框架。如果你想让别人自己写个插件,插到你的开源框架里,扩展某个功能。
经典的思想体现,大家平时都用,比如说jdbc。java定义了一套jdbc的接口,但是java没有提供jdbc的实现类。实际项目跑的时候要使用jdbc的哪些实现类呢?比如mysql,你就讲mysql-jdbc-connector引入进来;oracle,你就将oracle-jdbc-connector引入进来。在系统跑的时候,碰到你使用的jdbc的接口,它会在底层使用你引入的那个jar中的实现类。
比如时候,可以扩展负载均衡算法。
二、SPI示例
1、java SPI 示例
前面简单介绍了SPI机制的原理,本文通过一个示例演示java SPI的使用方法。首先,我们定义一个接口,名称为Robbit。
public interface Robot {
void sayHello();
}
接下来有两个实现类,分别为 OptimusPrime 和 Bumblebee。
public class OptimusPrime implements Robot {
@Override
public void sayHello() {
System.out.println("Hello, I am Optimus Prime.");
}
}
public class Bumblebee implements Robot {
@Override
public void sayHello() {
System.out.println("Hello, I am Bumblebee.");
}
}
接下来,META-INF/services文件下创建一个文件,名称为Robot的全限定名org.apache.spi.Robo。文件内容实现类的全限定名。
org.apache.spi.OptimusPrime
org.apache.spi.Bumblebee
接下来看测试代码:
public class JavaSPITest {
@Test
public void sayHello() throws Exception {
ServiceLoader<Robot> serviceLoader = ServiceLoader.load(Robot.class);
System.out.println("Java SPI");
serviceLoader.forEach(Robot::sayHello);
}
}
测试结果如下:
从结果可以看出,两个实现类都被成功的加载,并输出了相应的内容。
2、Dubbo SPI 示例
Dubbo 并未使用Java SPI,而是重新实现了一套功能更强的SPI机制。Dubbo SPI的相关逻辑被封装在了ExtensionLoader类中,通过ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI所需的配置文件,需放置在META-INF/dubbo路径下,配置内容如下。
optimusPrime = org.apache.spi.OptimusPrime
bumblebee = org.apache.spi.Bumblebee
与Java SPI实现类配置不同,Dubbo SPI是通过键值对的方式进行配置。这样我们可以按需加载指定的实现类。另外在测试Dubbo SPI时,需要在Robot接口上标注@SPI注解。下面来演示Dubbo SPI的用法。
public class DubboSPITest {
@Test
public void sayHello() throws Exception {
ExtensionLoader<Robot> extensionLoader =
ExtensionLoader.getExtensionLoader(Robot.class);
Robot optimusPrime = extensionLoader.getExtension("optimusPrime");
optimusPrime.sayHello();
Robot bumblebee = extensionLoader.getExtension("bumblebee");
bumblebee.sayHello();
}
}
测试结果如下:
三、实际项目中的应用
dubbo的spi扩展实现。 调用拦截扩展filter 。具体参考dubbo官网filter。
接下来再贴一篇Filter隐式传参。
场景:比如说A系统调用B系统的方法test(a,b)。现迭代一版需求,test方法需要借助参数c才能完成。也就是需要额外提供test(a,b,c)方法。(dubbo提供的接口不能直接扩展参数。假如扩展参数,B系统部署了2台服务,先部署B服务,新代码上线后,A服务调用B服务的新代码就会出错)。
我们系统中A调用B传参继承公共BaseapiRequest,它包含了requestID、user、以及一些公参(比如当前渠道号、安卓还是ios,p参数等)。
最后
以上就是美丽小兔子为你收集整理的[dubbo]spi是啥?dubbo的spi是怎么实现的?的全部内容,希望文章能够帮你解决[dubbo]spi是啥?dubbo的spi是怎么实现的?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复