我是靠谱客的博主 美丽小兔子,最近开发中收集的这篇文章主要介绍[dubbo]spi是啥?dubbo的spi是怎么实现的?,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、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是怎么实现的?所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部