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

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

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 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
  	  Invoker refer(Class 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")
     Invoker select(List> 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就是该规则产生

转换接口名转换后AbcEfgabc.efgProtocolprotocol

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注解作用,标记以及默认实现类的命名

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5700265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存