当当网开源Dubbox,扩展Dubbo服务框架支持REST风格远程调用
当当网近日开源了 Dubbox 项目,可为 Dubbo 服务框架提供多项扩展功能,包括 REST 风格远程调用、Kryo/FST 序列化等等。
当当网架构部和技术委员会架构师沈理向 InfoQ 中文站介绍了 Dubbox 项目,开发背景和主要特点描述如下:
Dubbo 是一个被国内很多互联网公司广泛使用的开源分布式服务框架,即使从国际视野来看应该也是一个非常全面的 SOA 基础框架。作为一个重要的技术研究课题,在当当网我们根据自身的需求,为 Dubbo 实现了一些新的功能,并将其命名为 Dubbox(即 Dubbo eXtensions)。
主要的新功能包括:
- 支持 REST 风格远程调用(HTTP + JSON/XML):基于非常成熟的 JBoss RestEasy 框架,在 dubbo 中实现了 REST 风格(HTTP + JSON/XML)的远程调用,以显著简化企业内部的跨语言交互,同时显著简化企业对外的 Open API、无线 API 甚至 AJAX 服务端等等的开发。事实上,这个 REST 调用也使得 Dubbo 可以对当今特别流行的“微服务”架构提供基础性支持。 另外,REST 调用也达到了比较高的性能,在基准测试下,HTTP + JSON 与 Dubbo 2.x 默认的 RPC 协议(即 TCP + Hessian2 二进制序列化)之间只有 1.5 倍左右的差距,详见下文的基准测试报告。
- 支持基于 Kryo 和 FST 的 Java 高效序列化实现:基于当今比较知名的 Kryo 和 FST 高性能序列化库,为 Dubbo 默认的 RPC 协议添加新的序列化实现,并优化调整了其序列化体系,比较显著的提高了 Dubbo RPC 的性能,详见下图和文档中的基准测试报告。
-
支持基于嵌入式 Tomcat 的 HTTP remoting 体系:基于嵌入式 tomcat 实现 dubbo 的 HTTP remoting 体系(即 dubbo-remoting-http),用以逐步取代 Dubbo 中旧版本的嵌入式 Jetty,可以显著的提高 REST 等的远程调用性能,并将 Servlet API 的支持从 2.5 升级到 3.1。(注:除了 REST,dubbo 中的 WebServices、Hessian、HTTP Invoker 等协议都基于这个 HTTP remoting 体系)。
-
升级 Spring:将 dubbo 中 Spring 由 2.x 升级到目前最常用的 3.x 版本,减少项目中版本冲突带来的麻烦。
-
升级 ZooKeeper 客户端:将 dubbo 中的 zookeeper 客户端升级到最新的版本,以修正老版本中包含的 bug。
上面很多功能已在当当网内部稳定的使用,现在开源出来,供大家参考和指正。也希望感兴趣的朋友也来为 Dubbo 贡献更多的改进。
注:dubbox 和 dubbo 2.x 是兼容的,没有改变 dubbo 的任何已有的功能和配置方式(除了升级了 Spring 之类的版本)。另外,dubbox 也严格遵循了 Apache 2.0 许可证的要求。
附:分布式服务框架与 RPC 框架
目前开源领域能找到的分布式服务框架也有不少,比较有代表性的包括 推ter 的 Finagle(基于 Scala 语言),Flipkart(印度最大的 B2C 网站)的 Phantom(文档较少),Apache 的 Tuscany(有点陈旧,而且不是很适合互联网公司)等等,其实国内也有少数公司提供了开源 Java 服务框架,但 dubbo 在其功能完善性、架构优雅性、使用简便性等方面依然有其相对独特的优势,尽管 dubbo 绝大部分的开发都是 2012 年以前完成的。
另外,业界的开源 RPC 框架更是数量众多,难以计数,但是,一般的 RPC 框架和我们讨论的分布式服务框架还是具有相当大的距离,比如在远程调用的多协议、多序列化支持,完善的服务治理等等方面都有较多的缺失。也正是由于这种缺失,著名的 Apache Thrift 等框架在这里也可归为 RPC 框架,而主要构建在 Thrift 之上的 Finagle、Phantom 等框架更接近于完整的分布式服务框架(当然,Dubbo 其实也支持 Thrift,只是还不太完善)。
有关沈理
沈理,目前在当当网的架构部和技术委员会担任架构师,主要负责当当网的 SOA 实施(即服务化)以及分布式服务框架的开发。以前也有在 BEA、Oracle、Redhat 等外企的长期工作经历,从事过多个不同 SOA 相关框架和容器的开发。