• Dubbo服务框架解析(二)


    本节介绍dubbo-common,dubbo-common是公共逻辑模块,包含Util类、通用模型,是其他模块的基础。


    扩展机制


    SPI

    SPI是扩展点的注解。标注在类型上。全部的扩展点须要通过SPI来标注。

    约定:

    在扩展类的jar包内。放置扩展点配置文件:META-INF/dubbo/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔。

    1)        自己主动Wrap扩展点的Wrapper类

    ExtensionLoader会在载入扩展点时(通过扩展点配置文件里内容)。假设该实现有拷贝构造函数。则判定为扩展点Wrapper类。

    2)        自己主动注入关联扩展点

    载入扩展点时,扩展点实现类的成员假设为其他扩展点类型,ExtensionLoader在会自己主动注入依赖的扩展点。

    3)        缺省获得的的扩展点是一个Adaptive Instance

    假设ExtensionLoader注入的依赖扩展点是一个Adaptive实例,直到扩展点方法运行时才决定调用是一个扩展点实现。

    Adaptive

    实现扩展点的自适应,能够标注在类型和方法上。在ExtensionLoader生成Extension的Adaptive Instance时。为ExtensionLoader提供扩展点信息。

    以下是Dubbo的Transporter扩展点的代码:

    @SPI("netty")

    publicinterfaceTransporter{

     

        /**

         * Bind a server.

         *

         * @seecom.alibaba.dubbo.remoting.Transporters#bind(URL, Receiver, ChannelHandler)

         * @param url serverurl

         * @param handler

         * @return server

         * @throws RemotingException

         */

        @Adaptive({Constants.SERVER_KEY, Constants.TRANSPORTER_KEY})

        Server bind(URL url, ChannelHandlerhandler)throws RemotingException;

     

        /**

         * Connect to a server.

         *

         * @seecom.alibaba.dubbo.remoting.Transporters#connect(URL, Receiver, ChannelListener)

         * @param url serverurl

         * @param handler

         * @return client

         * @throws RemotingException

         */

        @Adaptive({Constants.CLIENT_KEY, Constants.TRANSPORTER_KEY})

        Client connect(URL url, ChannelHandlerhandler)throws RemotingException;

     

    }

    对于bind方法,Adaptive实现先查找"server"key,假设该Key没有值则找"transport"key值。来决定代理到哪个实际扩展点。

    ExtensionFactory

    ExtensionFactory本身也是一种SPI。属于扩展点本身的载入容器,可从不同容器载入扩展点。


    当中AdaptiveExtensionFactory标注为Adaptive,支持扩展点的自己主动激活。当例如以下所看到的没有參数时。属于无条件自己主动激活。

    @Adaptive

    publicclass AdaptiveExtensionFactoryimplementsExtensionFactory

    当有參数时,为有条件激活。

    Logger

    Logger也是一种扩展。

    当中LoggerAdapter适配接口是一种SPI。


    在Dubbo中,实现了JCL、JDK、Log4J和Slf4J的多种实现。

    例如以下图所看到的我们经常使用的两种。


    ThreadPool

    ThreadPool也是一种扩展SPI。

    服务提供方线程实现策略。当server收到一个请求时。须要在线程池中创建一个线程去运行服务提供方业务逻辑。

    @SPI("fixed")

    publicinterfaceThreadPool{

       

        /**

         * 线程池

         *

         * @param url线程參数

         * @return线程池

         */

        @Adaptive({Constants.THREADPOOL_KEY})

        Executor getExecutor(URL url);

     

    }

    如上SPI的參数作为默认的线程池类型,getExecutor方法中,通过"threadpool"的key来做到自适应扩展。

    在Dubbo中实现了Fixed、Cached和Limited多种线程池的实现。


    Serialize

    Serialize是这里的核心接口。将对象转成字节流。用于网络传输,以及将字节流转为对象,用于在收到字节流数据后还原成对象。

    下图是Dubbo中定义的接口。


    下图是Dubbo中定义的扩展实现。各自是:

    • NativeJavaSerialization:原生java序列化实现。
    • CompactedJavaSerialization:压缩java序列化,主要是在原生java序列化基础上,实现了自己定义的类描写叙述符写入和读取。写Object类型的类描写叙述符仅仅写入类名称,而不是类的完整信息。这样有非常多Object类型的情况下能够降低序列化后的size。
    • JavaSerialization:仅仅是对原生java序列化和压缩java序列化的封装。

    • JsonSerialization:原生JSON序列化实现。

    • FastJsonSerialization:使用阿里的FastJson实现的序列化。
    • Hessian2Serialization:使用Hessian2的IO机制实现的序列化。

    • DubboSerialization:Dubbo自己定义的序列化实现。


    Compiler

    Compiler是SPI。Java代码编译器。用于动态生成字节码,加速调用。


    实现了JDK和Javassist的实现。当中使用的Javassist是一个开源的分析、编辑和创建Java字节码的类库。Javassist是JBoss的一个子项目,其基本的长处,在于简单。并且高速。


  • 相关阅读:
    结对编程(阶段二)
    结对编程 第一阶段
    Git实验
    webpack02
    webpack01
    实验五 单元测试
    实验四 代码审评
    UML建模工具的安装和使用
    实验二 结对编程(阶段二)
    博客园背景的修改
  • 原文地址:https://www.cnblogs.com/llguanli/p/7267443.html
Copyright © 2020-2023  润新知