栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 中SPI和Dubbo中SPI的区别

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 中SPI和Dubbo中SPI的区别

今天分享两者区别:

1、原理方面:

java是一次性加载完毕,浪费资源。

Dubbo是对javaSPI的扩展,以键值对的形式存在,用到哪个实现类取哪一个,而且可以分组,默认注解配置等方式。

2、代码示例:

1)javaspi示例:

定义一个接口:

public interface Log {
    void debug();
}

定义两个实现类:

public class Log4j implements Log {
    @Override
    public void debug() {
        System.out.println("==========log4j");
    }
}


public class Logback implements Log {
    @Override
    public void debug() {
        System.out.println("========logback");
    }
}


配置文件配置:

代码:

cn.enjoy.javaspi.Log4j
cn.enjoy.javaspi.Logback

 测试获取代码:

public class MyTest {
    public static void main(String[] args) {
        //这个代码就会加载META-INF/services 下面的log接口的文件中的所有类
        ServiceLoader all = ServiceLoader.load(Log.class);
        Iterator iterator = all.iterator();
        //这个地方需要挨个遍历去区分每一个实例的不同
        while (iterator.hasNext()) {
            Log next = iterator.next();
            if(next instanceof Log4j) {
                next.debug();
            }
        }
    }
}

2)dubbospi代码示例:

定义接口一个:

//这个注解一定要
@SPI("spring")
public interface ActivateApi {
    
    String todo(String param);
}

定义实现类N个:

import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.common.extension.Adaptive;

@Adaptive
@Activate(order = 2,group = {"dubbo"})
public class DubboActivate implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}


@Activate(group = {"mybatis","mybatis1"})
public class MyBatisActivate implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}


@Activate(group = {"rabbitmq"})
public class RabbitmqActivate implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}

@Activate(group = {"rabbitmq"})
public class RabbitmqActivate1 implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}


@Activate(value = {"value1"},group = {"rabbitmq"})
public class RabbitmqActivate2 implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}


@Activate(group = {"spring"})
public class SpringActivate implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}

@Activate(order = 1,group = {"springcloud"})
public class SpringCloudActivate implements ActivateApi {
    @Override
    public String todo(String param) {
        return param;
    }
}

配置文件配置:

 核心配置:

dubbo=cn.enjoy.dubbospi.DubboActivate
mybatis=cn.enjoy.dubbospi.MyBatisActivate
rabbitmq=cn.enjoy.dubbospi.RabbitmqActivate
rabbitmq1=cn.enjoy.dubbospi.RabbitmqActivate1
rabbitmq2=cn.enjoy.dubbospi.RabbitmqActivate2
spring=cn.enjoy.dubbospi.SpringActivate
springcloud=cn.enjoy.dubbospi.SpringCloudActivate

 

 测试类:

import cn.nandao.dubbospi.ActivateApi;
import com.alibaba.dubbo.common.URL;
import com.alibaba.dubbo.common.extension.ExtensionLoader;
import com.alibaba.dubbo.registry.Registry;
import com.alibaba.dubbo.registry.RegistryFactory;
import com.alibaba.dubbo.rpc.Protocol;
import com.alibaba.dubbo.rpc.ProxyFactory;
import org.junit.Test;

import java.util.List;
 
public class SpiTest {

    @Test
    public void adaptive() {
        //@Adaptive 有单独的api那实现了这个注解的实现类
        ActivateApi adaptiveExtension = ExtensionLoader.getExtensionLoader(ActivateApi.class).getAdaptiveExtension();
        System.out.println(adaptiveExtension.getClass());
    }

    
    @Test
    public void test1() {
        URL url = URL.valueOf("test://localhost/test");
        url = url.addParameter("value1","gggg");
        //只看分组,不看url中的参数
        List rabbitmq = ExtensionLoader.getExtensionLoader(ActivateApi.class).getActivateExtension(url, new String[]{"spring"}, "rabbitmq");
        System.out.println(rabbitmq.size());
        for (ActivateApi activateApi : rabbitmq) {
            System.out.println(activateApi.getClass());
        }
    }

    @Test
    public void defaultL() {
        //寻找@SPI注解中配置的value值
        System.out.println(ExtensionLoader.getExtensionLoader(ActivateApi.class).getDefaultExtension());
        System.out.println(ExtensionLoader.getExtensionLoader(ActivateApi.class).getDefaultExtensionName());

        //根据指定的name拿值
        System.out.println(ExtensionLoader.getExtensionLoader(ActivateApi.class).getExtension("mybatis"));
        System.out.println(ExtensionLoader.getExtensionLoader(ActivateApi.class).getSupportedExtensions());
    }

    @Test
    public void protocol() {
//        Protocol protocolproxy = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
//        System.out.println(protocolproxy);
        System.out.println(ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension());
    }

    @Test
    public void proxyFactory() {
        System.out.println(ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension());
    }

    @Test
    public void override() {
        RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
        Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://192.168.67.19:2184"));
        registry.register(URL.valueOf("override://0.0.0.0/com.xiangxue.jack.service.UserService?category=configurators&dynamic=false&application=dubbo_provider&timeout=8900"));
    }

    @Test
    public void decode() {
        System.out.println(URL.decode("route%3A%2F%2F0.0.0.0%2Fcom.xiangxue.jack.service.UserService%3Fcategory%3Drouters%26dynamic%3Dfalse%26enabled%3Dtrue%26force%3Dfalse%26name%3DrouteTest%26priority%3D0%26router%3Dcondition%26rule%3Dmethod%2B%253D%2BqueryUser%2B%253D%253E%2Bprovider.cluster%2B%253D%2Bfailover%2B%2526%2Bprovider.host%2B%253D%2B192.168.90.126%2B%2526%2Bprovider.protocol%2B%253D%2Bdubbo%26runtime%3Dfalse"));
    }

    @Test
    public void providerReg() {
        RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
        Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://192.168.67.19:2184"));
        registry.register(URL.valueOf("dubbo://192.168.2.23:20880/com.xiangxue.jack.service.UserService?anyhost=true&application=dubbo_provider&bean.name=ServiceBean:com.xiangxue.jack.service.UserService&connections=10&doKill.actives=10&doKill.executes=10&doKill.return=true&dubbo=2.0.2&generic=false&interface=com.xiangxue.jack.service.UserService&methods=doKill,queryUser&owner=world&pid=5704&revision=0.0.1-SNAPSHOT&side=provider×tamp=1626242405336&token=3d9492a1-c9ca-4bb4-a5de-a76a7a93684e"));
    }

}

到此两者区别分享完毕,大家稍后一定多多测试,定会很快掌握。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854643.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号