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. [洛谷3041]视频游戏的连击Video Game Combos

    题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...

  2. 通过代码来调用log4net写日志

    1.使用如下配置 http://www.cnblogs.com/chucklu/p/5404813.html 2.调用 string ConfigFile; private void LoadLogC ...

  3. LeetCode——Add Strings

    LeetCode--Add Strings Question Given two non-negative integers num1 and num2 represented as string, ...

  4. java基础(3)--8种基本类型

    八种基本类型 数据类型分为两大类:基本类型,引用类型 基本类型有8种,除了基本类型(8种)以外任何类型都是引用类型.如: String 是引用类型 基本类型有8种(首字母是小写): 整数:byte, ...

  5. 解决socket负载均衡集群方案和代码实现

    有一段时间,在考虑下socket 之间集群 可以在Nginx 下可以 但是不同服务器之间怎么通讯呢 后来自己也想可不可以用什么东西或者中间件来通讯 ,后来在百度之下 发现果然就是按照我所想的 ,在网上 ...

  6. CodeForces - 767C

    花了6个小时,终于成功ac...... 两边dfs,第一遍求子树和,第二遍判断有没有2*t[s]/3和t[s]/3,因为要求的节点可能是在同一条线上,同时要有2*t[s]/3和t[s]/3的情况,且2 ...

  7. 牛客比赛-Wannafly9-A/B/C

    A-链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 ...

  8. require.js资料

    1.http://www.ruanyifeng.com/blog/2012/11/require_js.html?bsh_bid=230697246 (require.js的用法) 2.http:// ...

  9. tflearn kears GAN官方demo代码——本质上GAN是先训练判别模型让你能够识别噪声,然后生成模型基于噪声生成数据,目标是让判别模型出错。GAN的过程就是训练这个生成模型参数!!!

    GAN:通过 将 样本 特征 化 以后, 告诉 模型 哪些 样本 是 黑 哪些 是 白, 模型 通过 训练 后, 理解 了 黑白 样本 的 区别, 再输入 测试 样本 时, 模型 就可以 根据 以往 ...

  10. 【2018年全国多校算法寒假训练营练习比赛(第四场)-A】石油采集(匈牙利算法)

    试题链接:https://www.nowcoder.com/acm/contest/76/A [思路] 每个‘#’的右边和下边如果也是‘#’说明这两个点构成通路,以此重构一幅图,然后找二分图的最大匹配 ...