dubbo源码分析第三篇-dubbo-spi介绍

文章目录

  • dubbo spi 简介
    • @Adaptive的key获取规则
    • dubbo spi 查找位置
    • spi文件内容
  • 总结

dubbo spi 简介

  • 涉及注解
注解 作用
SPI 起标注作用,但当value不为空,value表示spi默认实现
Adaptive 可放置类与方法上,放置类上表示接口的Adaptive类; 放置在方法上,通过动态代理调用相应方法
Activate 一般放置在类上,表示其是一个激活类

Adaptive用法

  • 1类上: 此时获取的自适应类是非动态代理类,由该类自行完成方法调用逻辑

Compiler compiler = ExtensionLoader.getExtensionLoader(Compiler.class).getAdaptiveExtension()

@Adaptive
public class AdaptiveCompiler implements Compiler {
	非动态编译类,完成自适应选择
    @Override
    public Class<?> compile(String code, ClassLoader classLoader) {
        Compiler compiler;
        ExtensionLoader<Compiler> loader = ExtensionLoader.getExtensionLoader(Compiler.class);
        String name = DEFAULT_COMPILER; 
        if (name != null && name.length() > 0) {
            compiler = loader.getExtension(name);
        } else {
            compiler = loader.getDefaultExtension();
        }
        return compiler.compile(code, classLoader);
    }

}
  • 方法上
@SPI("dubbo")
public interface Protocol {
    @Adaptive
  	 <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
}

ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()

1 此时获取的类是一个动态代理类,调用方法时 根据Adaptive注解的value值获取url参数上的key,根据该key对应的value值获取对应的Protocol实现类
2 比如url为*****?protocol=dubbo,则调用DubboProtocol.refer

Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension()
protocol.refer(type,url);

@Adaptive的key获取规则

1 配置了val ,则获取url上的key为该val

@SPI(RandomLoadBalance.NAME)
public interface LoadBalance {
	直接取URL上loadbalance = XX
    @Adaptive("loadbalance")
    <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;

}

2 配置了val数组 则获取url上的key为该val数组的顺序

public interface Transporter extends org.apache.dubbo.remoting.Transporter {
	先取URL上server=XX,取不到再取transporter=XX
    @Adaptive({"server","transporter"})
}

3 没有配置 ,比如刚刚的Protocol接口,则val为接口名驼峰转点号
则取url上abc.efg |=XX 而Protocol接口取protocol就是该规则产生

转换接口名 转换后
AbcEfg abc.efg
Protocol protocol

xx就是下文spi文件 的key=value 的key

dubbo spi 查找位置

位置 作用
/META-INF/dubbo/internal 一般dubbo内部的spi接口定义此处
/META-INF/services 兼容jdk查找
/META-INF/dubbo 一般应用程序spi定义于此处

spi文件内容

dubbo=org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol

总结

  • 为什么使用dubboSPI ,dubbo spi实例化时根据URL入参决定具体实例化哪个实现类,避免jdk那样全盘实例化,提高资源响应速度,按需加载
  • 介绍spi的配置位置,配置格式
  • 介绍Adaptive注解作用于方法和类上的区别
  • 介绍Spi注解作用,标记以及默认实现类的命名

你可能感兴趣的:(dubbo源码分析,rpc,java,zookeeper)