配色: 字号:
Dubbox:来自当当网的SOA服务框架
2017-03-31 | 阅:  转:  |  分享 
  
Dubbox:来自当当网的SOA服务框架http://www.biaodianfu.com/dubbo.htmlDubbo是一个来自阿里巴巴
的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等。并
将其命名为Dubbox(即DubboeXtensions)。Dubbox主要的新功能包括:一、支持REST风格远程调用(HTTP
+JSON/XML)dubbo支持多种远程调用方式,例如dubboRPC(二进制序列化+tcp协议)、httpinvo
ker(二进制序列化+http协议,至少在开源版本没发现对文本序列化的支持)、hessian(二进制序列化+http协议)
、WebServices(文本序列化+http协议)等等,但缺乏对当今特别流行的REST风格远程调用(文本序列化+htt
p协议)的支持。dubbox基于非常成熟的JBossRestEasy框架,在dubbo中实现了REST风格(HTTP+JSO
N/XML)的远程调用,以显著简化企业内部的跨语言交互,同时显著简化企业对外的OpenAPI、无线API甚至AJAX服务端等等的
开发。事实上,这个REST调用也使得Dubbo可以对当今特别流行的“微服务”架构提供基础性支持。另外,REST调用也达到了比较高
的性能,在基准测试下,HTTP+JSON与Dubbo2.x默认的RPC协议(即TCP+Hessian2二进制序列化)之间
只有1.5倍左右的差距。REST的优点(摘自维基百科):可更高效利用缓存来提高响应速度通讯本身的无状态性可以让不同的服务器的处理一
系列请求中的不同请求,提高服务器的扩展性浏览器即可作为客户端,简化软件需求相对于其他叠加在HTTP协议之上的机制,REST的软件依
赖性更小不需要额外的资源发现机制在软件技术演进中的长期的兼容性更好基于简单的文本格式消息和通用的HTTP协议,使REST具备极广的
适用性,几乎所有语言和平台都对它提供支持,同时其学习和使用的门槛也较低。在dubbo中支持REST,可以为当今多数主流的远程调用场
景都带来好处:显著简化企业内部的异构系统之间的(跨语言)调用。此处主要针对这种场景:dubbo的系统做服务提供端,其他语言的系统(
也包括某些不基于dubbo的java系统)做服务消费端,两者通过HTTP和文本消息进行通信。即使相比Thrift、ProtoBu
f等二进制跨语言调用方案,REST也有自己独特的优势(详见后面讨论)显著简化对外OpenAPI(开放平台)的开发。既可以用du
bbo来开发专门的OpenAPI应用,也可以将原内部使用的dubboservice直接“透明”发布为对外的OpenREST
API(当然dubbo本身未来最好可以较透明的提供诸如权限控制、频次控制、计费等诸多功能)显著简化手机(平板)APP或者PC桌面客
户端开发。类似于2,既可以用dubbo来开发专门针对无线或者桌面的服务器端,也可以将原内部使用的dubboservice直接“
透明”的暴露给手机APP或桌面程序。当然在有些项目中,手机或桌面程序也可以直接访问以上场景2中所述的OpenAPI。显著简化浏览
器AJAX应用的开发。类似于2,既可以用dubbo来开发专门的AJAX服务器端,也可以将原内部使用的dubboservice直接
“透明”的暴露给浏览器中JavaScript。当然,很多AJAX应用更适合与web框架协同工作,所以直接访问dubboservi
ce在很多web项目中未必是一种非常优雅的架构。为企业内部的dubbo系统之间(即服务提供端和消费端都是基于dubbo的系统)提供
一种基于文本的、易读的远程调用方式。一定程度简化dubbo系统对其它异构系统的调用。可以用类似dubbo的简便方式“透明”的调用非
dubbo系统提供的REST服务(不管服务提供端是在企业内部还是外部)需要指出的是,1~3是dubbo的REST调用最有价值的三
种应用场景,并且为dubbo添加REST调用,其最主要到目的也是面向服务的提供端,即开发REST服务来提供给非dubbo的(异构)
消费端。归纳起来,所有应用场景如下图所示:二、支持基于Kryo和FST的Java高效序列化实现dubboRPC是dubbo体系中
最核心的一种高性能、高吞吐量的远程调用方式,简单的说:长连接:避免了每次调用新建TCP连接,提高了调用的响应速度多路复用:单个TC
P连接可交替传输多个请求和响应的消息,降低了连接的等待闲置时间,从而减少了同样并发数下的网络连接数,提高了系统吞吐量。dubbo
RPC主要用于两个dubbo系统之间作远程调用,特别适合高并发、小数据的互联网场景。而序列化对于远程调用的响应速度、吞吐量、网络带
宽消耗等同样也起着至关重要的作用,是我们提升分布式系统性能的最关键因素之一。在dubboRPC中,同时支持多种序列化方式,例如
:dubbo序列化:阿里尚未开发成熟的高效java序列化实现,阿里不建议在生产环境使用它hessian2序列化:hessian是一
种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的hessianlite,它是dubb
oRPC默认启用的序列化方式json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实
现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。java序列化:主要是采用
JDK自带的Java序列化实现,性能很不理想。在通常情况下,这四种主要序列化方式的性能从上到下依次递减。对于dubboRPC这种
追求高性能的远程调用方式来说,实际上只有1、2两种高效序列化方式比较般配,而第1个dubbo序列化由于还不成熟,所以实际只剩下2可
用,所以dubboRPC默认采用hessian2序列化。但hessian是一个比较老的序列化实现了,而且它是跨语言的,所以不是
单独针对java进行优化的。而dubboRPC实际上完全是一种JavatoJava的远程调用,其实没有必要采用跨语言的序列
化方式(当然肯定也不排斥跨语言的序列化)。最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:专门针
对Java语言的:Kryo,FST等等跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等
这些序列化方式的性能多数都显著优于hessian2(甚至包括尚未成熟的dubbo序列化)。有鉴于此,我们为dubbo引入Kryo和
FST这两种高效Java序列化实现,来逐步取代hessian2。其中,Kryo是一种非常成熟的序列化实现,已经在Twitter、
Groupon、Yahoo以及多个著名开源项目(如Hive、Storm)中广泛的使用。而FST是一种较新的序列化实现,目前还缺乏
足够多的成熟使用案例,但它还是非常有前途的。三、其他新功特性支持基于嵌入式Tomcat的HTTPremoting体系:基于嵌入
式tomcat实现dubbo的HTTPremoting体系(即dubbo-remoting-http),用以逐步取代Dubbo
中旧版本的嵌入式Jetty,可以显著的提高REST等的远程调用性能,并将ServletAPI的支持从5升级到3.1。(注:除了
REST,dubbo中的WebServices、Hessian、HTTPInvoker等协议都基于这个HTTPremoting
体系)。升级Spring:将dubbo中Spring由x升级到目前最常用的3.x版本,减少项目中版本冲突带来的麻烦。升级ZooKe
eper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。Dubbox当前的主要功能支
持REST风格远程调用(HTTP+JSON/XML):基于非常成熟的JBosshttp://resteasy.jboss.o
rg/RestEasy框架,在dubbo中实现了REST风格(HTTP+JSON/XML)的远程调用,以显著简化企业内部的跨语
言交互,同时显著简化企业对外的OpenAPI、无线API甚至AJAX服务端等等的开发。事实上,这个REST调用也使得Dubbo可
以对当今特别流行的“微服务”架构提供基础性支持。另外,REST调用也达到了比较高的性能,在基准测试下,HTTP+JSON与D
ubbo2.x默认的RPC协议(即TCP+Hessian2二进制序列化)之间只有1.5倍左右的差距,详见文档中的基准测试报告
。支持基于Kryo和FST的Java高效序列化实现:基于当今比较知名的https://github.com/EsotericSof
tware/kryoKryo和FST高性能序列化库,为Dubbo默认的RPC协议添加新的序列化实现,并优化调整了其序列化体系,比较
显著的提高了DubboRPC的性能,详见文档中的基准测试报告。支持基于Jackson的JSON序列化:基于业界应用最广泛的htt
p://jackson.codehaus.org/Jackson序列化库,为Dubbo默认的RPC协议添加新的JSON序列化实现。
支持基于嵌入式Tomcat的HTTPremoting体系:基于嵌入式tomcat实现dubbo的HTTPremoting体系(
即dubbo-remoting-http),用以逐步取代Dubbo中旧版本的嵌入式Jetty,可以显著的提高REST等的远程调用性
能,并将ServletAPI的支持从2.5升级到3.1。(注:除了REST,dubbo中的WebServices、Hessian
、HTTPInvoker等协议都基于这个HTTPremoting体系)。升级Spring:将dubbo中Spring由2.x升
级到目前最常用的3.x版本,减少版本冲突带来的麻烦。升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最
新的版本,以修正老版本中包含的bug。支持完全基于Java代码的Dubbo配置:基于Spring的JavaConfig,实现完全
无XML的纯Java代码方式来配置dubbo调整Demo应用:暂时将dubbo的demo应用调整并改写以主要演示REST功能、Du
bbo协议的新序列化方式、基于Java代码的Spring配置等等。修正了dubbo的bug包括配置、序列化、管理界面等等的bug
。注:dubbox和dubbo2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了spring之类的版本)版
本详见:https://github.com/dangdangdotcom/dubbox/releaseshttps://gith
ub.com/dangdangdotcom/dubbox/releasesdubbox-2.8.0:该版本已经在生产环境中使用,主
要支持REST风格远程调用、支持Kryo和FST序列化、升级了Spring和Zookeeper客户端、调整了demo应用等等dub
box-2.8.1:主要支持基于嵌入式tomcat的http-remoting,优化了REST客户端性能,在REST中支持限制服务
端接纳的最大HTTP连接数等等dubbox-2.8.2:支持REST中的HTTPlogging,包括HTTPheader的字
段和HTTPbody中的消息体,方便调试、日志纪录等等提供辅助类便于REST的中文处理改变使用@Referenceannota
tion配置时的异常处理方式,即当用annotation配置时,过去dubbo在启动期间不抛出依赖服务找不到的异常,而是在具体调用
时抛出NPE,这与用XML配置时的行为不一致。较大的充实了DubboREST的文档dubbox-2.8.3:在REST中支持d
ubbo统一的方式用beanvalidationannotation作参数校验(沈理)在RpcContext上支持获取底层协议
的Request/Response(沈理)支持采用Spring的JavaConfig方式配置dubbo(马金凯)在Dubbo协议中支持基于Jackson的json序列化(Dylan)在SpringAOP代理过的对象上支持dubboannotation配置(Dylan)修正Dubbo管理界面中没有consumer时出现空指针异常(马金凯)修正https://github.com/Reference@Referenceannotation中protocol设置不起作用的bug(沈理)修正https://github.com/Reference@Referenceannotation放在setter方法上即会出错的bug(Dylan)
献花(0)
+1
(本文系关平藏书首藏)