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的多种实现。
例如以下图所看到的我们经常使用的两种。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2lsYmVydHpob3U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
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的一个子项目,其基本的长处,在于简单。并且高速。
Dubbo服务框架解析(二)的更多相关文章
- 当当网开源Dubbox,扩展Dubbo服务框架支持REST风格远程调用
当当网近日开源了Dubbox项目,可为Dubbo服务框架提供多项扩展功能,包括REST风格远程调用.Kryo/FST序列化等等. 当当网架构部和技术委员会架构师沈理向InfoQ中文站介绍了Dubbox ...
- Dubbo服务框架和spring-cloud架构的优缺点
Dubbo一.dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. Dubbo是一款高性能.轻 ...
- Volley 框架解析(二)--RequestQueue核心解读
主要围绕RequestQueue进行解读,它的两个请求队列CacheQueue.NetworkQueue是如何调用的,第一条请求的执行过程及如何处理重复请求?对RequestQueue及相关的类进行详 ...
- 微服务框架学习二:Http调用
1. HTTP接口的意义 二进制接口使用的是java/hessian序列化协议,不能很好的与其他语言通信,虽然hessian也是一种跨语言的通用协议,但很多语言没有很好的实现该协议的产品.所以为了能够 ...
- dubbo服务框架学习
====================================================================================== 1.提供注册服务.消费者可 ...
- 【转】阿里巴巴分布式服务框架 Dubbo 团队成员梁飞专访
原文链接:http://www.iteye.com/magazines/103 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,每天为2000+ 个服务提供3,000,000,000+ ...
- 高性能的分布式服务框架 Dubbo
我思故我在,提问启迪思考! 1. 什么是Dubbo? 官网:http://dubbo.io/,DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及作为SOA服务治理的 ...
- RPC服务框架dubbo(一):简介和原理解析
前置概念 在学习dubbo前,需要先了解SOA和RPC这两个概念. SOA 1.英文名称(Service Oriented Ambiguity) 2.中文名称:面向服务架构 2.1 有一个专门提供服务 ...
- 基于开源Dubbo分布式RPC服务框架的部署整合
一.前言 Dubbo 作为SOA服务化治理方案的核心框架,用于提高业务逻辑的复用.整合.集中管理,具有极高的可靠性(HA)和伸缩性,被应用于阿里巴巴各成员站点,同时在包括JD.当当在内的众多互联网项目 ...
随机推荐
- Delphi部份函数,命令,属性中文说明
Abort 函数 引起放弃的意外处理 Abs 函数 绝对值函数 AddExitProc 函数 将一过程添加到运行时库的结束过程表中 Addr 函数 返回指定对象的地址 AdjustLineBreaks ...
- 4lession-输入函数
接受字符串的方法 #!/usr/bin/python string = raw_input("\nplease inter you string:\n") print(string ...
- Solr 倒排索引
正排索引(正向索引):正排表是以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出所有包含查询关键字的文档. 正排表结构如图1所示,这种组织方法在建立索引的 ...
- 需求:在浏览器加载完毕后,自动播放视频:出现play() failed because the user didn't interact with the document first.错误
解决方法:给video标签加入<video muted></video> 静音即可. Chrome 66为了避免标签产生随机噪音. 参考链接:https://juejin.im ...
- js面向对象1----了解构造函数
一.构造函数与实例的区别 1 构造函数 构造函数主要是一种用于生成对象的饼干模具,这些对象具有默认属性和属性方法,它可以创建多个共享特定特性和行为的对象. 构造函数只是一个函数,但当函数遇到了ne ...
- 学习笔记:Vue——自定义指令
在Vue2.0中,代码复用和抽象的主要形式是组件.然鹅,有的情况下,你仍然需要对普通DOM元素进行底层操作,这时候就会用到自定义指令. 1.举个聚焦输入框的例子,全局注册focus指令 Vue.dir ...
- MyBatis学习总结(14)——Mybatis使用技巧总结
1. 区分 #{} 和 ${}的不同应用场景 1)#{} 会生成预编译SQL,会正确的处理数据的类型,而${}仅仅是文本替换. 对于SQL: select * from student where x ...
- 防止登录页面出如今frame中
在使用frame页面嵌套开发的时候,遇到重新启动了server的时候会出现登录页面在frame页面中出现, 所以须要在登录页面里面用js推断下当前的地址信息,然后跳转到登录的单独页面中. js代码例如 ...
- DIV+CSS学习笔记
第十五章 定位 static静态定位(不对它的位置进行改变,在哪里就在那里) 默认值.没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明 ...
- 一起学JAVA之《spring boot》03 - 开始spring boot基本配置及项目结构(转)
<div class="markdown_views"> <h3 id="一导航"><a name="t0"& ...