`

使用Dubbox为dubbo提供REST服务

 
阅读更多

Dubbo 是阿里多年前开源的一套服务治理框架,在众多互联网企业里应用广泛。当当在dubbo的基础上开发了 dubbox (Dubbo eXtensions),支持REST风格远程调用。本文在 服务治理框架dubbo上手指南 的基础上使用dubbox提供的REST服务。 

准备环境

首先参考 服务治理框架dubbo上手指南 ,实现自己的dubbo服务。在此基础上,让我们来看看在Dubbo中开发REST风格的远程调用 。REST的优势就不多说了,本文关注的是快速搭建环境。

光看dubbox的官方文档稍微有一点儿坑,因为它对于maven依赖的描述基本没有。Dubbo本身的维护已经不太活跃了,最新的版本是 2.5.4-SNAPSHOT 。当当接下了维护的重任,目前的最新版是 dubbox-2.8.4 ,其实groupId和artifactId还是原来的不变,只是版本号有变化罢了。所以首先让我们来升级一下依赖,在 helloImpl 的 pom.xml 里升级dubbo:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.8.4</version>
    <exclusions>
        <exclusion>
            <artifactId>spring-expression</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-beans</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
        <exclusion>
            <artifactId>spring-aop</artifactId>
            <groupId>org.springframework</groupId>
        </exclusion>
    </exclusions>
</dependency>

使用 mvn dependency:tree 命令可以看到,dubbox依赖于spring的 3.2.9.RELEASE 版本。由于我们上一个dubbo的练习中使用了spring的 4.2.4.RELEASE 版本,所以会有依赖冲突。解决冲突的办法有两个,一是把我们的spring降级到dubbox依赖的 3.2.9.RELEASE 版本,二是使用exclusions把dubbox依赖的几个spring包都解除掉。这里我们的配置采用了后者。除了dubbox本身,我们还需要以下的依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.2.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.7</version>
</dependency>

再然后就是 dubbox自身的依赖 ,不管有用没用,先加进来再说:

<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxrs</artifactId>
    <version>3.0.7.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-client</artifactId>
    <version>3.0.7.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>

<!-- 如果要使用json序列化 -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jackson-provider</artifactId>
    <version>3.0.7.Final</version>
</dependency>

<!-- 如果要使用xml序列化 -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jaxb-provider</artifactId>
    <version>3.0.7.Final</version>
</dependency>

<!-- 如果要使用netty server -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-netty</artifactId>
    <version>3.0.7.Final</version>
</dependency>

<!-- 如果要使用Sun HTTP server -->
<dependency>
    <groupId>org.jboss.resteasy</groupId>
    <artifactId>resteasy-jdk-http</artifactId>
    <version>3.0.7.Final</version>
</dependency>

<!-- 如果要使用tomcat server -->
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>8.0.11</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-logging-juli</artifactId>
    <version>8.0.11</version>
</dependency>

这样就把所有的依赖都解决了,现在可以修改dubbo的服务配置文件 provider.xml 了:

<!--<dubbo:protocol name="dubbo" port="19880" />-->
<dubbo:protocolname="rest"server="tomcat"port="9090" />

把原来的dubbo协议注释掉,增加rest协议,用内置的tomcat启动,端口为9090。这里为了清晰起见,注释掉了dubbo协议,而实际上协议是可以并存的。接下来可以改造我们的 HelloServiceImpl 了。直接放上最后的代码:

package org.ggg.hello.service.provider;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;

import org.ggg.hello.service.HelloService;

@Path("demo")
public class HelloServiceImpl implements HelloService {

    @GET
    @Path("greeting")
    @Produces("application/json; charset=UTF-8")
    public String sayHello(@QueryParam("name") String name) {
        return "Hello " + name;
    }
}

首先我们在类上增加了一个注解 @Path("demo") ,它指定访问HelloService的URL相对路径是/demo,即 http://localhost:9090/demo 。方法上也有一个 @Path("greeting") ,相当于访问这个方法的URL为 http://localhost:9090/demo/greeting 。 @GET 就不用多说了, @Produces 可以在Response Headers里增加 Content-Type: application/json;charset=UTF-8 。如果有必要,也可以来一个相对应的 @Consumes("application/json") 。在参数上还有一个注解 @QueryParam("name") ,有了它就可以通过URL参数的方式传值过来了。启动 Provider 之后,没有意外的话应该能看见控制台的日志: Starting ProtocolHandler [“http-nio-9090”] ,接下来就可以通过访问 http://localhost:9090/demo/greeting?name=ggg 来访问我们的服务了。屏幕上可以看到: Hello ggg 。

至此,我们以一个并不太RESTful的URL完成了一个REST请求。

分享到:
评论

相关推荐

    dubbox 2.8.4

    7. **dubbo-config-api-2.8.4.jar**:配置管理API,提供服务的动态配置、发布、订阅等功能,使得服务配置更加灵活和便捷。 8. **dubbo-registry-api-2.8.4.jar**:注册中心API,用于服务的注册和发现。Dubbox支持...

    dubbox 2.8.4 rest调用

    3. **REST接口实现**:在Java代码中,会看到使用dubbox提供的API实现的REST服务,这些服务通常继承自dubbox的抽象类或实现了特定的接口。 4. **客户端调用示例**:项目可能包含一个简单的客户端应用,演示如何通过...

    dubbox2.8.4

    Dubbo是阿里巴巴贡献的高性能、轻量级的服务治理框架,而dubbox则在其基础上添加了更多的特性与优化,为开发者提供了更强大的功能。 【描述】中提到的"根据当当源码打包成的dubbox"意味着这个压缩包包含了dubbox...

    Dubbox 2.8.4相关jar包

    - **REST客户端**:Dubbo-rpc-rest提供了REST客户端,使得服务消费者可以直接使用HTTP请求调用REST服务。 - **数据转换**:支持将Java对象自动转换为HTTP请求体和响应体,简化了服务间的数据交互。 - **与现有...

    dubbox打包编译2.8.4版本jar及dubbo-admin2.8.4.war

    -- 用dubbo协议在20880端口暴露服务,使用内嵌服务器jetty[默认] main函数启动 --&gt; &lt;dubbo:protocol name="dubbo" port="20990" serialization="kryo"/&gt;&lt;!-- --&gt; &lt;dubbo:protocol name="rest" port="20980" server...

    dubbox2.84

    【Dubbox2.8.4】是阿里巴巴开源的一款基于Java的RPC框架,它在Apache Dubbo的基础上进行了一些改进和增强,旨在提供更加高效、稳定的服务治理能力。这个压缩包包含了Dubbox的jar包以及关于如何安装和使用Dubbox源码...

    dubbox2.5.1-2.8.4包集合

    为了使用这些Maven编译包,你需要在你的Maven项目中添加对应的依赖,这样就可以在你的项目中直接引用Dubbo或Dubbox的服务。具体操作如下: 1. 在`pom.xml`文件中添加依赖: ```xml &lt;groupId&gt;...

    gateway-dubbox:服务网关集成dubbox rest服务

    而对于前端提供服务则使用rest协议。前端应用面临许多rest服务,为了解决调用的统一,所以需要一个网关系统。为什么自己写对于api网关,现在已有框架可以解决该类问题,但是基于java语言开源的没有(除了zuul,也有...

    dubbox框架源码和使用实例

    **Dubbox 框架详解及使用实例** Dubbox 是由淘宝开源的一个基于 Java 的分布式服务框架,它是基于阿里巴巴的 Dubbo 进行了扩展和优化。Dubbox 提供了更多的特性和更好的社区支持,使其在微服务架构中广泛应用。本篇...

    dubbo-monitor, 基于Dubbox最新版本重新开发的简单监控.zip

    1. **Dubbo**:Dubbo是一个高性能、轻量级的Java RPC框架,用于构建微服务架构,它提供服务发现、注册、调用、负载均衡等功能,便于服务治理。 2. **Dubbox**:Dubbox是当Dubbo发展停滞时,由当当网维护的一个分支...

    dubbox需要用到的jar

    【标题】"dubbox需要用到的jar" 描述了Dubbo的一个特定使用场景,涉及到的组件包括`dubbo-rpc-rest-2.8.4`、`rpc-webservice-2.8.4`以及核心库`dubbo-2.8.4.jar`。这些组件在IT领域中的应用主要集中在服务治理和服务...

    此包是dubbox所需要以及tomcat服务器的包

    综上所述,`dubbox`和`Tomcat`的结合使用为品优购商城提供了稳定、高效的后端服务基础。通过这两个技术,开发者可以构建出具有高可用性和可扩展性的Web应用,满足商城的业务需求,同时保持良好的运维体验。理解并...

    dubbo monitor 管理控制台 基于dubbox 2.8.4 编译

    4. **服务暴露**:为了让Dubbo Monitor能够监控到服务,服务提供者需要在配置中指定监控地址,例如在`application.xml`中添加`&lt;dubbo:monitor protocol="registry" /&gt;`,这样服务提供者会自动向注册中心报告监控数据...

    dubbox服务例子

    服务提供者是分布式服务的核心组件,它将具体的业务逻辑封装为服务,然后通过 Dubbox 框架对外发布。UProvider1 和 UProvider2 可能代表两种不同的服务实现,它们各自提供了不同的接口或者实现了不同的业务逻辑。在...

    dubbo-2.8.4.jar

    github最新版(on 31 Mar 2015 dubbox-2.8.4)反编译过来的,如果不嫌麻烦自己也可以去下载并编译哦,现在的资源分不能设置为免费?

    dubbox-dubbox-2.8.4 源码

    Dubbox 2.8.4是其一个稳定版本,为开发者提供了丰富的API和高度可配置的选项,以实现高性能、高可用的服务治理。本文将从多个角度深入探讨Dubbox 2.8.4的源码,帮助读者理解其内部工作原理和设计思路。 一、服务...

    dubbo生产者消费者使用demo

    在Dubbo中,服务提供者(Producer)暴露服务,而服务消费者(Consumer)调用这些服务。通过配置文件,我们可以定义服务接口、实现类、版本、调用方式等信息,使得服务之间的通信变得简单且高效。 二、创建服务提供...

    dubbox-master.zip 最新的2018.0706

    7. **API 易用性**:Dubbox 提供了简单的 API 接口,使得开发者能够快速地定义和使用服务,降低了开发复杂性。 8. **扩展性**:Dubbox 设计上注重扩展性,例如支持自定义 Filter(过滤器)、Protocol(协议)、...

Global site tag (gtag.js) - Google Analytics