我是靠谱客的博主 爱笑可乐,最近开发中收集的这篇文章主要介绍Dubbo学习(四)——扩展点加载机制SPI,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

1.spi是什么?

假设有个接口有3个实现类,在系统运行时对这个接口到底该选择哪个实现类?这时就需要spi了,需要根据指定的配置或者默认的配置,去找到对应的实现类加载进来,然后用这个实现类的实例对象

2.spi一般用在哪?

用在插件扩展的场景。

3.spi的思想体现?

(1)java spi思想体现:比如jdbc

java 定义了一套jdbc接口,但是java并没有提供jdbc的实现类,但是实际项目时要使用jdbc接口的哪些实现类呢?要根据自己使用的数据库,比如mysql的mysql-jdbc.jar,oracle的oracle-jdbc.jar。在系统跑时碰到使用jdbc的接口,会在底层使用自己引入的那个jar提供实现类

(2)dubbo的spi思想体现:自己的一套spi机制

Protocol接口,在系统运行的时候,dubbo会判断一下应该选用这个Protocol接口的哪个实现类类实例化对象来使用,它会找一个你自己配置的Protocol,将自己配置的Protocol实现类加载到jvm中来,然后实例化对象

       下面这个代码就是dubbo大量使用的,就是对很多组件都是保留一个接口和多个实现,然后在系统运行的时候动态根据配置去找到对应的实现类,如果没配置就走默认的实现类:

Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();

下面举个例子:

@SPI("dubbo")  
public interface Protocol {        
    int getDefaultPort();  
  
    @Adaptive  
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;    
    @Adaptive  
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;  

    void destroy();  
  
}  

/META_INF/dubbo/internal/com.alibaba.dubbo.rpc.Protocol文件中有如下配置:

dubbo=com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol
http=com.alibaba.dubbo.rpc.protocol.http.HttpProtocol
hessian=com.alibaba.dubbo.rpc.protocol.hessian.HessianProtocol

dubbo 的 spi 机制默认是Protocol 接口

@SPI("dubbo"):作用是通过SPI机制来提供实现类,实现类是通过dubbo作为默认key去配置文件里找的,配置文件名称与接口全限定名一样,通过dubbo作为key找到默认的实现类就是:com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol

如果想要动态替换默认实现类,就要使用@Adaptive接口,如上代码Protocol接口中有两个方法加了@Adaptive注解的作用就是——那两个接口会被代理实现

那两个接口会被代理实现啥意思?

   在运行时会针对 Protocol 生成代理类,这个代理类的那俩方法里面会有代理代码,代理代码会在运行的时候动态根据url中的protocol来获取那个key,默认是dubbo;也可以自己指定,如果指定了别的key就会获取别的实现类实例

4.如何自己扩展dubbo中的组件?

(1)新建一个那种可以打成 jar 包的工程——src/main/resources 目录下,搞一个 META-INF/services,里面放个文件叫com.alibaba.dubbo.rpc.Protocol——文件里写一个my=com.bingo.MyProtocol,自己把 jar 弄到 nexus 私服里去

(2)新建一个dubbo provider(生产者) 工程——在这个工程依赖(1)中自己打包成的jar——然后在 spring 配置文件里给个配置:

<dubbo:protocol name=”my” port=”20000” />

(3)provider 启动的时候,就会加载到(1)中 jar 包里的my=com.bingo.MyProtocol 这行配置里,接着会根据自己的配置使用自己定义好的MyProtocol了。

通过上述(1)~(3)方式可以替换掉大量dubbo内部组件,仅仅是扔个自己的jar包然后配置下

dubbo-spi

总结:

        也就是说如果想要扩展一个东西,只要自己写一个jar,让你的consumer或者provider工程依赖自己的那个jar,在自己的jar里指定目录下配置好接口名称对应的文件,里面通过key=实现类

然后对于对应的组件,类似<dubbo:protocol>用自己的那个key对应的实现类来实现某个接口,可以自己企业扩展dubbo的各种功能,提供自己的实现。

最后

以上就是爱笑可乐为你收集整理的Dubbo学习(四)——扩展点加载机制SPI的全部内容,希望文章能够帮你解决Dubbo学习(四)——扩展点加载机制SPI所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部