• 四、dubbo的SPI介绍以及源码剖析


    一、SPI介绍

    SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能。SPI 机制在第三方框架中也有所应用,比如 Dubbo 就是通过 SPI 机制加载所有的组件。不过,Dubbo 并未使用 Java 原生的 SPI 机制,而是对其进行了增强,使其能够更好的满足需求。在 Dubbo 中,SPI 是一个非常重要的模块。基于 SPI,我们可以很容易的对 Dubbo 进行拓展。

    二、JDK中的SPI

    三、Dubbo中的SPI

    1、基本介绍

     我们从官方给出的架构图中可以发现,dubbo的分层中,总共十层,只有service和config层没有使用SPI扩展机制,其他各层都是用了SPI

    dubboSPI的使用

     2、 Dubbo SPI中的Adaptive功能 

    Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension 统一对指定接口对应的所有扩展点进行封装,通过URL的方式对扩展点来进行
    动态选择。 (dubbo中所有的注册信息都是通过URL的形式进行处理的。)这里同样采用相同的方式进行实现。 
     
    定义:
    1、创建接口在@SPI中指定默认使用的扩展点名称
    2、在接口的方法中使用@Adaptive注解,并且使用org.apache.dubbo.common.URL作为参数,用于区分动态选择扩展点的key
    3、创建实现类(可以提供多个实现类)
    4、配置扩展点到配置文件中(配置多个)
    使用:
    URL url = URL.valueOf("test://localhost/hello?hello.service=dog");
    final HelloService adaptiveExtension =ExtensionLoader.getExtensionLoader(HelloService.class).getAdaptiveExtension();
    adaptiveExtension.sayHello(url); 
    说明:
    因为在这里只是临时测试,所以为了保证URL规范,前面的信息均为测试值即可,关键的点在于hello.service 参数,这个参数的值指定的就是具体的实现方式。
    关于为什么叫hello.service 是因为这个接口的名称,其中后面的大写部分被dubbo自动转码为 . 分割。通过 getAdaptiveExtension 来提供一个统一的类来对所有的扩展点提供支持(底层对所有的扩展点进行封装)。
    调用时通过参数中增加 URL 对象来实现动态的扩展点使用。
    如果URL没有提供该参数,则该方法会使用默认在 SPI 注解中声明的实现。 

    源码的话就看一下官网吧,官网说得挺细的!
     
     
  • 相关阅读:
    安装ActiveMQ
    maven 包冲突的问题(maven helper)
    依赖冲突的原因以及解决办法
    inno setup读取注册表遇到的一个坑
    用格式工厂转换视频为avi格式,视频太大,不好存,想压缩了但不改变画面清晰度,怎么设置参数?
    inno setup 自定义生成的卸载程序
    innosetup 安装前、卸载前判断是否有进程正在运行
    Inno Setup安装卸载时检查程序是否运行提示并中止程序
    trs.getElementsByTagName is not a function 出现原因及解决办法
    一行上自动控制数据长度,并换行
  • 原文地址:https://www.cnblogs.com/qsky/p/13798562.html
Copyright © 2020-2023  润新知