首页 > 代码库 > Dubbo服务框架解析(二)
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。服务提供方线程实现策略,当服务器收到一个请求时,需要在线程池中创建一个线程去执行服务提供方业务逻辑。
@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的一个子项目,其主要的优点,在于简单,而且快速。
Dubbo服务框架解析(二)