一、dubbox的由来

   dubbox是当当网基于dubbo的基础上开发的扩展版,也可以认为是dubbo的升级版,根据当前互联网的应用需求,增加了很多扩展的功能。

   dubbox并没有发布到maven中央仓库的包,目前代码在github上,需要自己down下来编译,基于maven开发的。

   项目GitHub地址:https://github.com/dangdangdotcom/dubbox

   在根目录下执行 mvn install -Dmaven.test.skip=true,等待编译完成 ,注:在jdk8环境下编译dubbox不成功,会出现一些class的方法过时无法编译的问题,切换到jdk7正常。

二、dubbox当前的主要功能

  摘录官方的说明:

  • 支持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高效序列化实现:基于当今比较知名的KryoFST高性能序列化库,为Dubbo默认的RPC协议添加新的序列化实现,并优化调整了其序列化体系,比较显著的提高了Dubbo RPC的性能,详见文档中的基准测试报告。

  • 支持基于Jackson的JSON序列化:基于业界应用最广泛的Jackson序列化库,为Dubbo默认的RPC协议添加新的JSON序列化实现。

  • 支持基于嵌入式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。

  • 支持完全基于Java代码的Dubbo配置:基于Spring的Java Config,实现完全无XML的纯Java代码方式来配置dubbo

  • 调整Demo应用:暂时将dubbo的demo应用调整并改写以主要演示REST功能、Dubbo协议的新序列化方式、基于Java代码的Spring配置等等。

  • 修正了dubbo的bug 包括配置、序列化、管理界面等等的bug。

注:dubbox和dubbo 2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了spring之类的版本)

  

三、搭建rest服务应用

  搭建dubbox和dubbox应用是一样的,这里依旧使用Spring+maven。

  项目的pom.xml文件如下:

  

  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.bigbang</groupId>
  5. <artifactId>service-provider</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>service-provider</name>
  9. <properties>
  10. <spring.version>3.2.4.RELEASE</spring.version>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>junit</groupId>
  15. <artifactId>junit</artifactId>
  16. <version>3.8.1</version>
  17. <scope>test</scope>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.springframework</groupId>
  21. <artifactId>spring-context</artifactId>
  22. <version>${spring.version}</version>
  23. </dependency>
  24.  
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-core</artifactId>
  28. <version>${spring.version}</version>
  29. </dependency>
  30.  
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-beans</artifactId>
  34. <version>${spring.version}</version>
  35. </dependency>
  36.  
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-webmvc</artifactId>
  40. <version>${spring.version}</version>
  41. </dependency>
  42.  
  43. <dependency>
  44. <groupId>com.alibaba</groupId>
  45. <artifactId>dubbo</artifactId>
  46. <version>2.8.4</version>
  47. </dependency>
  48.  
  49. <dependency>
  50. <groupId>org.jboss.resteasy</groupId>
  51. <artifactId>resteasy-jaxrs</artifactId>
  52. <version>3.0.7.Final</version>
  53. </dependency>
  54. <dependency>
  55. <groupId>org.jboss.resteasy</groupId>
  56. <artifactId>resteasy-client</artifactId>
  57. <version>3.0.7.Final</version>
  58. </dependency>
  59. <dependency>
  60. <groupId>javax.validation</groupId>
  61. <artifactId>validation-api</artifactId>
  62. <version>1.0.0.GA</version>
  63. </dependency>
  64.  
  65. <dependency>
  66. <groupId>org.jboss.resteasy</groupId>
  67. <artifactId>resteasy-jackson-provider</artifactId>
  68. <version>3.0.7.Final</version>
  69. </dependency>
  70.  
  71. <dependency>
  72. <groupId>com.fasterxml.jackson.core</groupId>
  73. <artifactId>jackson-core</artifactId>
  74. <version>2.3.3</version>
  75. </dependency>
  76. <dependency>
  77. <groupId>com.fasterxml.jackson.core</groupId>
  78. <artifactId>jackson-databind</artifactId>
  79. <version>2.3.3</version>
  80. </dependency>
  81.  
  82. <dependency>
  83. <groupId>org.mortbay.jetty</groupId>
  84. <artifactId>jetty</artifactId>
  85. <version>6.1.26</version>
  86. </dependency>
  87.  
  88. </dependencies>
  89. <build>
  90. <plugins>
  91. <plugin>
  92. <groupId>org.apache.maven.plugins</groupId>
  93. <artifactId>maven-compiler-plugin</artifactId>
  94. <configuration>
  95. <source>1.7</source>
  96. <target>1.7</target>
  97. </configuration>
  98. </plugin>
  99. </plugins>
  100. <finalName>service-provider</finalName>
  101. </build>
  102. </project>

pom.xml

  主要引用了dubbo的2.8.4版本的包,以及restful和jackson依赖的包。

  dubbox的restful是使用标准java rest api:JAX-RS。一般使用它的几个注解就可以了。

  那么现在来编写一个服务的接口,以一个用户管理的模块为例,需要一个接口UserService.java:

  

  1. public interface UserService {
  2.   //注册
  3. String regist(User user);
  4.   //查询
  5. User queryById(Long id);
  6. }

  接口实现类UserServiceImpl.java:

  

  1. import javax.servlet.http.HttpServletRequest;
  2. import javax.ws.rs.Consumes;
  3. import javax.ws.rs.POST;
  4. import javax.ws.rs.Path;
  5. import javax.ws.rs.PathParam;
  6. import javax.ws.rs.Produces;
  7. import javax.ws.rs.core.MediaType;
  8.  
  9. import com.alibaba.dubbo.rpc.RpcContext;
  10. import com.bigbang.domain.User;
  11. import com.bigbang.service.UserService;
  12.  
  13. @Path("user")
  14. public class UserServiceImpl implements UserService {
  15.  
  16. @POST
  17. @Path("regist")
  18. @Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
  19. @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_XML })
  20. @Override
  21. public String regist(User user) {
  22. System.out.println(user);
  23. HttpServletRequest request = (HttpServletRequest) RpcContext.getContext().getRequest();
  24. String host = request.getLocalAddr();
  25. return "regist success!, ur host is:" + host;
  26. }
  27.  
  28. @POST
  29. @Path("{id:\\d+}")
  30. @Produces({ MediaType.APPLICATION_JSON })
  31. @Override
  32. public User queryById(@PathParam("id") Long uid) {
  33. User user = new User();
  34. user.setId(uid);
  35. user.setName("jetty");
  36. user.setAge(25);
  37. return user;
  38. }
  39.  
  40. }

  注解代码说明:

  @Path:代表服务的访问路径,如“user”,则访问路径为domain:port/context/user,在方法上注解是相对类上面的。依次展开路径即可。

  @POST:服务请求的方式,支持POST、GET等。

  @Consumes:表示将接收到的数据自动转换为什么格式的,支持json和xml。

  @Produces:表示将结果返回时候输出为什么格式的,支持json和xml。

  @PathParm:用来修饰方法参数的。配合@Path中的指定变量名使用。

  在dubbo的spring配置文件中添加以下的配置:

  

  1. <dubbo:application name="service-provider" />
  2.  
  3. <dubbo:registry address="multicast://224.5.6.7:1234" />
  4.  
  5. <!-- 指定服务使用rest协议并且暴露在8080端口 -->
  6. <dubbo:protocol name="rest" port="8080" />
  7.  
  8. <dubbo:service interface="com.bigbang.service.UserService"
  9. ref="userService" />
  10. <bean id="userService" class="com.bigbang.service.impl.UserServiceImpl" />

  在这里不再默认使用dubbo的协议,而是改用rest,并且启用8080端口暴露服务。

  因为restful特有的原因,不再限制客户端为什么语言,甚至通过ajax也能访问,这里选用Postman作为客户端访问,测试效果。

  访问第一个接口的注册用户服务效果如下:

  

  访问接口的查询用户服务效果如下:

  

四、一些问题

  官方说出的一些点可以参考。

  •   注解写在接口还是实现类上

     建议写在实现类上,避免污染接口,保持接口的纯净和广泛使用性。如果接口和实现类都写了注解,则会忽略接口上的注解。

  •   上下Context的获取方法

        获取上下文Context有很多种方法,可以在方法参数上增加注解@Context获取servlet的request和response对象,或者使用dubbo提供的RpcContext类获取。两种方法                  各有利弊,第一种方法会污染接口,第二种方法会对代码有入侵。

  •   是否透明化发布rest服务

      因为dubbo的rest调用在代码上使用了注解,实际是业务处理的service上。如果你认为这样做污染了代码,那么可以使用Facade和DTO,在Facade和DTO上面添加注                 解,然后再调用响应的业务处理类。而事实上,把注解添加到实现类上基本没有什么问题,因为它是遵循java标准的。

dubbox实现REST服务的更多相关文章

  1. 使用Dubbox构架分布式服务

    第一部分:Dubbo的背景分析及工作原理 1. Dubbo是什么?Dubbo是一个来自阿里巴巴的开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说 ...

  2. dubbo和dubboX与微服务架构(dubbo一)

    一.传统三层架构模式的缺陷 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)web.业务逻辑层(Bu ...

  3. RESTEasy-Rest服务框架

    什么是 RESTEasy RESTEasy 是 JBoss 的一个开源项目,提供各种框架帮助你构建 RESTful Web Services 和 RESTful Java 应用程序.它是 JAX-RS ...

  4. Dubbox分布式框架之入门

    Dubbox简介 Dubbox是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbox,被国内电商及换联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护, ...

  5. RPC服务框架dubbo(一):简介和原理解析

    前置概念 在学习dubbo前,需要先了解SOA和RPC这两个概念. SOA 1.英文名称(Service Oriented Ambiguity) 2.中文名称:面向服务架构 2.1 有一个专门提供服务 ...

  6. dubbox下载编译运行demo

    最近公司要搞微服务改造,拿了一个小项目开刀,找来找去,还是偏向当当的dubbox作为分布式服务框架.这里介绍下怎么一条龙跑起一个demo. 1.下载代码 因为代码放在github上,所以我们直接用Ec ...

  7. 使用dubbox开发REST应用

    新建项目,添加Maven支持. 在pom.xml中添加依赖. <dependency> <groupId>org.jboss.resteasy</groupId> ...

  8. Linux下安装Dubbox

    1.Dubbox简介 Dubbox 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续 ...

  9. dubbox 入门demo

    1.Dubbox简介 Dubbox 是一个分布式服务架构,其前身是阿里巴巴开源项目 Dubbo,被国内电商及互联网项目使用,后期阿里巴巴停止了该项目的维护,当当网便在 Dubbo 基础上进行优化,并继 ...

随机推荐

  1. C# 处理 JSON 常用的帮助类

    C#请求接口的方法,具体代码: 首先需要添加引用和第三方的组件,具体如下: 引用命名空间: using System.IO; using Newtonsoft.Json.Linq; using Sys ...

  2. HtmlHelper.Raw,<%%>,<%:%>,<%=%>的区别及使用

    Mvc中<%%>,<%:%>,<%=%>的区别及使用 1.<%%> <%%>之间可以执行服务端代码,如<% foreach (Data ...

  3. 用国内镜像源pip加速安装模块

    记住,如果使用了virtualenv,一定要先workon进入虚拟环境再执行包安装命令. pip install -i https://pypi.douban.com/simple/ 模块名(如:dj ...

  4. Linux之LVM设备的管理

    LVM可以理解为可扩展的设备:在设备空间不足的时候,保证其在原始数据不变的情况下增大设备的存储大小.那么,要达到这种效果,我们得把可用设备先比变为物理卷,再把物理卷处理为物理卷组,最后成为LVM逻辑卷 ...

  5. Linux下系统的定时及延时任务

    一.系统的延时 是临时的.对系统做的任务指定一个时间点.发起的命令是at at    时间点(now+1min)      ## 设定任务实行时间 at>  执行命令               ...

  6. ionic安装插件常用命令

    常见插件查找网站: http://ngcordova.com/docs/plugins http://cordova.apache.org/plugins/ $ ionic plugin list / ...

  7. mssqlserver SQL注释快捷键

    注释快捷键 选中语句(快捷键:光标定位到需要注释块的最顶行,按住shift+home选中行,放开再按下shift+向下键,选中块) 按住Ctrl然后依次按K,C取消注释快捷键 选中语句 按住Ctrl然 ...

  8. 如何修改MyEclipse的默认编码方式

    在创建jsp页面时,默认首行出现“<%@ page language="java" import="java.util.*" pageEncoding=& ...

  9. VERIFY DATABASE 正在异常终止。 (Microsoft SQL Server,错误: 3169)

    1.错误描述 标题: Microsoft SQL Server Management Studio ------------------------------ 备份介质验证失败: [文件: D:\S ...

  10. 【Hibernate实战】源码解析Hibernate参数绑定及PreparedStatement防SQL注入原理

        本文采用mysql驱动是5.1.38版本. 本篇文章涉及内容比较多,单就Hibernate来讲就很大,再加上数据库驱动和数据库相关,非一篇文章或一篇专题就能说得完.本文从使用入手在[Spr ...