dubbox服务提供者是REST风格的,消费者可能是从dubbox过来的,也可能是从第三方外部系统过来的。后者的话我们没得选,只能以服务提供者直连,服务治理平台和监控中心手再长,也管不到别人的地盘。但如果是dubbox自己作为消费端,那么就可以很容易配置各种服务治理参数了,也能被监控中心实时盯着。有利必有弊,本来dubbox提供REST风格的http调用就是为了方便异构客户端到服务提供者来交流的,为了纳入dubbo系统再套一层消费者岂不是脱裤子放屁,多此一举?多了一个人传话,对话就多了一层转换,多了一份丢话和失真的危险。

  消费端用spring的REST注解是最简单的,但因为服务端已经用dubbox的RESTEasy框架了,所以消费端还得重新用spring自己的REST实现一遍。这里为了偷懒,消费端还是用RESTEasy来搞,直接把服务端用到的公共接口复制到消费端作为控制类即可。首先我们用JAX-RS定义接口和bean,放到公用API包里,然后服务端实现这些API,消费端新增一个controller类来调用API,最后在web配置文件里指定使用RESTEasy作为servlet容器。

1、公用接口,使用JAX-RS注解,暴露服务端所提供的服务


import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.wlf.api.bean.Page;


@Path("/hello/world")
@Produces({MediaType.APPLICATION_JSON})
public interface MobileZoneResourceService
{
      
    @GET
    @Path("/nihao.jsp")
    public Page queryToday(@QueryParam("param") String param);
   
}


公用bean,使用JAX-RS注解

import java.io.Serializable;
import java.util.List;
import java.util.Map; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement
public class Page implements Serializable
{ private static final long serialVersionUID = -680237712312747858L; private Integer start; private Integer pageSize; private Integer totalSize; public Integer getStart()
{
return start;
} public void setStart(Integer start)
{
this.start = start;
} public Integer getPageSize()
{
return pageSize;
} public void setPageSize(Integer pageSize)
{
this.pageSize = pageSize;
} public Integer getTotalSize()
{
return totalSize;
} public void setTotalSize(Integer totalSize)
{
this.totalSize = totalSize;
}
}

2、服务提供者service类,注入DAO接口

import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired; import com.inspur.zoneresource.api.MobileZoneResourceService;
import com.inspur.zoneresource.api.bean.Page;
import com.inspur.zoneresource.provider.bean.BpmUserInfo;
import com.inspur.zoneresource.provider.dao.ZoneResourceService; public class MobileZoneResourceServiceImpl implements MobileZoneResourceService
{
@Autowired
private ZoneResourceService zoneResourceService; public Page queryToday(String param)
{
BpmUserInfo userinfo = null;
ObjectMapper om = new ObjectMapper();
try
{
userinfo = om.readValue(param, BpmUserInfo.class);
}
catch (Exception e)
{
e.printStackTrace();
} Page page = zoneResourceService.queryToday(userinfo);
return page;
}
}

DAO层接口

import com.inspur.zoneresource.api.bean.Page;
import com.inspur.zoneresource.provider.bean.BpmUserInfo; public interface ZoneResourceService { public Page queryToday(BpmUserInfo userinfo);
}

DAO层实现类就略过了

3、服务消费者控制类,提供http接口给外部调用,注入公共API

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType; import org.springframework.beans.factory.annotation.Autowired; import com.inspur.zoneresource.api.MobileZoneResourceService;
import com.inspur.zoneresource.api.bean.Page; @Path("/hello/world")
@Produces({MediaType.APPLICATION_JSON})
public class MobileZoneResourceController
{
@Autowired
private MobileZoneResourceService mobileZoneResourceService; @GET
@Path("/nihao.jsp")
public Page queryToday(@QueryParam("param") String param)
{
return mobileZoneResourceService.queryToday(param);
}
}

4、web配置

消费者web.xml,使用resteasy作为web容器分发控制器

<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:META-INF/spring/consumer.xml</param-value>
</context-param> <listener>
<listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener
</listener-class>
</listener> <listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
  
<listener>
<listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener
</listener-class>
</listener>
 
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

提供者web.xml,使用dubbo作为web容器分发控制器

<web-app>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:META-INF/spring/provider.xml</param-value>
</context-param> <listener>
<listener-class>com.alibaba.dubbo.remoting.http.servlet.BootstrapListener
</listener-class>
</listener> <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener> <servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>com.alibaba.dubbo.remoting.http.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

5、dubbo配置

消费者,通过把控制器配置为bean来加载

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <!-- 消费方应用信息,用于计算依赖关系 -->
<dubbo:application name="zr_consumer" /> <dubbo:registry address="zookeeper://127.0.0.1:2181" /> <!-- 消费者接口 -->
<dubbo:reference id="mobileZoneResourceService"
interface="com.inspur.zoneresource.api.MobileZoneResourceService" /> <!-- 对外control -->
<bean id="mobileZoneResourceController"
class="com.inspur.zoneresource.consumer.control.MobileZoneResourceController" /> </beans>

提供者

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="zr_provider" /> <context:property-placeholder location="classpath:global.properties" /> <!-- 使用zookeeper注册中心暴露服务地址 -->
<dubbo:registry protocol="zookeeper" address="${zk.servers}" /> <!-- 采用dubbox提供的REST风格服务(基于resteasy) -->
<dubbo:protocol name="rest" server="servlet" port="${rest.server.port}" /> <!-- timeout远程服务调用超时时间(毫秒),适用所有服务 -->
<!-- threads该服务线程池大小 ,适用所有服务 -->
<!-- accepts限制服务器端接受的连接不能超过个数,适用所有服务 -->
<dubbo:provider timeout="${timeout}" threads="${threads}"
accepts="${accepts}" /> <!-- 暴露服务接口 一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心 -->
<dubbo:service interface="com.inspur.zoneresource.api.MobileZoneResourceService"
ref="mobileZoneResourceService" /> <!-- 和本地bean一样实现服务 -->
<bean id="mobileZoneResourceService"
class="com.inspur.zoneresource.provider.service.MobileZoneResourceServiceImpl" /> <bean id="zoneResourceService"
class="com.inspur.zoneresource.provider.dao.ZoneResourceServiceImpl" /> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver.class}" />
<property name="url" value="${driver.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean> <bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
</beans>

global.properties

zk.servers=zookeeper://127.0.0.1:2181
rest.server.port=8098 timeout=5000
threads=100
accepts=1000 driver.class=oracle.jdbc.driver.OracleDriver
driver.url=jdbc:oracle:thin:@10.211.95.152:1521:testdba
db.username=ues
db.password=ues2017

  

  消费者使用RESTEasy框架需要的maven依赖:

        <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>org.jboss.resteasy</groupId>
<artifactId>resteasy-netty</artifactId>
<version>3.0.7.Final</version>
</dependency> <dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jdk-http</artifactId>
<version>3.0.7.Final</version>
</dependency> <dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>3.0.7.Final</version>
</dependency> <dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxb-provider</artifactId>
<version>3.0.7.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-spring</artifactId>
<version>3.0.7.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>3.0.7.Final</version>
</dependency>

  

使用resteasy作为dubbox消费者的更多相关文章

  1. dubbox消费者启动成功,却无法连接注册中心

    使用dubbox作为服务提供端很好实现,因为git的说明和网上有很多的例子可供参考,但是消费端都一笔带过,简单得很,初学者往往以为只要配置如下3样东西就够了: <?xml version=&qu ...

  2. dubbox2.8.4例子教程二

    简介 上篇博客写了个dubbox生产者,也用HttpClient代码测试了rest服务,下面记录dubbox消费者工程  一.工程结构    一.Simple.java package bhz.ent ...

  3. dubbox系列【三】——简单的dubbox提供者+消费者示例

    1.dubbox-provider示例 在eclipse中建立maven project,名为provider-parent,包含两个maven medule:provider-api 和 provi ...

  4. dubbox生产者与消费者案例

    一.首先要将dubbox添加到本地maven仓库     参考: https://blog.csdn.net/try_and_do/article/details/83383861     二.目录结 ...

  5. dubbo rest服务(消费者) java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine 错误问题

    1.版本 dubbo 2.7.3 2.描述 java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.Apac ...

  6. 分布式服务框架 dubbo/dubbox 入门示例

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  7. 分布式服务框架 dubbo/dubbox 入门示例(转)

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

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

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

  9. spring boot2整合dubbox全注解

    前题 dubbox是dubbo的一个升级版,简单说就是本来dubbo是阿里开发的,现在阿里不维护了,当当网拿过去继续开发.本来阿里的dubbo维护到2.6版本,而再高版本的都是当当网维护的就叫成dub ...

随机推荐

  1. redhat 6.8 配置yum源

    一般安装好redhat后,不能注册的话,不能使用系统自带的yum源.但是我们可以自己配置yum源来解决这一问题.下面介绍下redhat配置163yum源. 1. 检查是否安装yum包 rpm -qa ...

  2. MD5加密算法的java实现

    package other; import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/* * ...

  3. HTTP Status 500 - com.opensymphony.xwork2.ActionSupport.toAddPage()

    使用struts2过程中碰到以下错误 HTTP Status 500 - com.opensymphony.xwork2.ActionSupport.toAddPage() type Exceptio ...

  4. <<Hadoop基础教程》之初识Hadoop【转】

    Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...

  5. python 图像库PIL详解

    PIL详细文档 The most important class in the Python Imaging Library is the Image class, defined in the mo ...

  6. 用临时用户数据目录启动Chrome,关闭安全检查等(解决Cross origin requests are only supported for HTTP?)

    Cross origin requests are only supported for HTTP? 参考:https://www.zhihu.com/question/20948649 批处理: s ...

  7. 原生JS日历 + JS格式化时间格式

    公司项目中用到,以前没做过,废了好几个小时 终于做好了 先来效果图(暂时没写样式 凑合着看吧) 点击左右按钮都能改变月份 下方表格中的数据也会跟着变化 贴上代码 : html部分: <div s ...

  8. 【spark】常用转换操作:sortByKey()和sortBy()

    1.sortByKey() 功能: 返回一个根据键排序的RDD 示例 val list = List(("a",3),("b",2),("c" ...

  9. dubbo常见报错

    1. java.io.IOException: Can not lock the registry cache file C:\Users\Administrator\.dubbo\dubbo-reg ...

  10. Android Issue分析方法(用anr来说明)

    Log的产生大家都知道 , 大家也都知道通过DDMS来看log , 但什么时候会产生log文件呢 ?一般在如下几种情况会产生log文件 . 1,程序异常退出 , uncaused exception ...