码迷,mamicode.com
首页 > 其他好文 > 详细

dubbo实现原理之SPI简介

时间:2018-03-20 21:40:24      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:return   load   iterable   循环   rtt   div   策略   jar包   pos   

  dubbo采用微内核+插件体系,设计优雅,扩展性很强。微内核+插件体系是如何实现的呢?想必大家都知道SPI(service provider interface)机制。这种机制的原理是假如我们定义了服务接口标准,可以让厂商无实现。在jdk中,使用ServiceLoader类来实现spi机制的服务查找功能。

  接下来我们使用一个简单的例子,通过ServiceLoader来实现spi机制。先定义一个接口:

package com.ysl;

public interface Spi {
    boolean isSupportType(String type);
    String sayGoodBy();
}

  ServiceLoader会遍历所有的jar去查找META-INF/services/com.ysl.Spi文件

  假设A厂商提供的实现如下:

package com.ysl;

public class SpiAImpl implements Spi{

    @Override
    public boolean isSupportType(String type) {
        return "A".equals(type);
    }

    @Override
    public String sayGoodBy() {
        return "bye bye A";
    }
}

  在A厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为:com.ysl.SpiAImpl(厂商A的spi实现全路径类名)

  假设B厂商提供的实现如下: 

package com.ysl;

public class SpiBImpl implements Spi{

    @Override
    public boolean isSupportType(String type) {
        return "B".equals(type);
    }

    @Override
    public String sayGoodBy() {
        return "bye bye B";
    }
}

  在B厂商提供的jar包中的META-INF/services/com.ysl.Spi文件内容为:com.ysl.SpiBImpl(厂商B的spi实现全路径类名)

  ServiceLoader.load(Spi.class)读取厂商A、B提供jar包中的文件,ServiceLoader实现了Iterable接口可通过while for循环语句遍历出所有实现。

  一个接口多种实现,就如策略模式一样提供了策略的实现,但是没有提供策略的选择, 使用方可以根据isSupport方法根据业务传入厂商名来选择具体的厂商。

package com.ysl;

import java.util.ServiceLoader;

public class SpiFactory {
    private static ServiceLoader spiLoader = ServiceLoader.load(Spi.class);

    public static Spi getSpi(String name){
        for(Spi spi : spiLoader){
            if(spi.isSupportType(name)){
                return spi;
            }
        }
        return null;
    }
}

 

dubbo实现原理之SPI简介

标签:return   load   iterable   循环   rtt   div   策略   jar包   pos   

原文地址:https://www.cnblogs.com/senlinyang/p/8612458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!