Dubbo组件加载机制

Dubbo组件加载机制

Dubbo所有组件是通过SPI机制加载的,但Dubbo没有使用jdk提供的SPI,而是对SPI增强实现自己的Dubbo SPI。

SPI(Service Provider Interface)

SPI,Service Provider Interface,是一种服务发现机制。SPI本质是将接口的实现类的全限定名配置在文件中,由服务加载器读取配置文件,加载实现类。通过这种机制,可以为接口动态替换实现类。

Java SPI 示例

  • 新增接口
package com.dawn.dubbo.spi;
/**
 * Created by Dawn on 2019/10/16.
 */
public interface DawnSPI {
    void getName();
}
  • 实现类1
package com.dawn.dubbo.spi;
/**
 * Created by Dawn on 2019/10/16.
 */
public class JavaSPI implements DawnSPI {
    @Override
    public void getName() {
        System.out.println("Hi,JavaSPI");
    }
}
  • 实现类2
package com.dawn.dubbo.spi;
/**
 * Created by Dawn on 2019/10/16.
 */
public class DubboSPI implements DawnSPI {
    @Override
    public void getName() {
        System.out.println("Hi,DubboSPI");
    }
}
  • 在META-INF/services/目录下新增DawnSPI全限定名文件(org.dawn.dubbo.spi.DawnSPI),文件内容为接口实现类的所在包的全路径
    在这里插入图片描述
    补充下,为什么要在META-INF/services这个目录下新增全限定名文件,因为这个目录是ServiceLoader默认路径,打开ServiceLoader接口我们可以看到
    在这里插入图片描述
  • Java SPI测试类
/**
 * Created by dawn on 2019/10/16.
 */
public class JavaSPITest {
    @Test
    public void getName(){
        // 加载接口服务类
        ServiceLoader<DawnSPI> serviceLoader = ServiceLoader.load(DawnSPI.class);
        // :: jdk 1.8特性
        serviceLoader.forEach(DawnSPI::getName);
        // 等价
       /* Iterator iterator = serviceLoader.iterator();
        while (iterator.hasNext()){
            DawnSPI dawnSPI= (DawnSPI) iterator.next();
            dawnSPI.getName();
        }*/
    }
}
  • 运行结果
    在这里插入图片描述

Dubbo SPI示例

Dubbo SPI 实现逻辑封装在ExtensionLoader 类中,通过ExtensionLoader可以指定加载实现类,接口全限定名配置文件必须配置在META-INF/dubbo目录下,配置文件内容是key-value方式
在这里插入图片描述
在这里插入图片描述

同时与java spi不同,需要在接口添加dubbo 的SPI注解

  • 接口添加dubbo SPI注解,实现同上
@SPI
public interface DawnSPI {
    void getName();
}
  • Dubo SPI 测试类
public class DubboSPITest {
    @Test
    public void getName(){
        // 加载接口服务
        ExtensionLoader<DawnSPI> extensionLoader=ExtensionLoader.getExtensionLoader(DawnSPI.class);
        System.out.println("******************Dubbo Service Privice Interface");
        // 指定加载实现类
        DawnSPI  dubboSPI=extensionLoader.getExtension("dubboSPI");
        dubboSPI.getName();
        // 指定加载实现类
        DawnSPI javaSPI=extensionLoader.getExtension("javaSPI");
        javaSPI.getName();
    }
}
  • 运行结果
    在这里插入图片描述

总结

本文介绍了dubbo组件的加载机制 SPI,介绍了Java SPI 及Dubbo SPI使用示例。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值