一、前言

  项目中用到了Dubbo,临时抱大腿,学习了dubbo的简单实用方法。现在就来总结一下dubbo如何提供服务,如何消费服务,并做了一个简单的demo作为参考。

二、Dubbo是什么

  Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
  1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
  2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
  3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

  摘自:http://www.cnblogs.com/Javame/p/3632473.html

三、dubbo配置

  1.dubbo需要依赖的jar

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.hjz</groupId><artifactId>dubbo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><modules><module>hjz-dubbo-api</module><module>hjz-dubbo-consumer</module><module>hjz-dubbo-provider</module></modules><dependencies><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.8.4</version></dependency><dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.12.1.GA</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version></dependency><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency></dependencies>
</project>

  2.dubbo服务接口

package com.hjz.dubbo.api;public interface DubboServiceTest {public int calculate(int a, int b);
}

  3.dubbo服务生产者配置

  实现dubbo服务的接口

package com.hjz.service;import org.springframework.stereotype.Service;import com.hjz.dubbo.api.DubboServiceTest;@Service("dubboServiceTest")
public class DubboServiceProvider implements DubboServiceTest {@Overridepublic int calculate(int a, int b) {return a+b;}}

  dubbo服务提供者配置:classpath:dubbo-provider-example.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><description>dubbo公共配置</description><!-- 扫描需要注入到spring容器中的bean --><context:component-scan base-package="com.hjz.service" /><!-- 引入dubbo需要的配置文件 --><context:property-placeholder location="classpath:dubbo-example.properties" />    <!-- 同一个工程只配置一份即可 --><dubbo:application name="hjz-dubbo" owner="hjzgg"/><!-- 发布dubbo需要对外的协议(dubbo)和端口(20880),20880是dubbo默认提供的端口,若一台机器发布多个dubbo服务,则此端口需要显示配置,多个dubbo服务端口需要不一样,否则会端口冲突 --><dubbo:protocol name="dubbo" port="${dubbo.protocol.port}" serialization="java"/><!-- 配置dubbo服务失败后的重试次数和接口超时时间 --><dubbo:provider retries="0" timeout="${dubbo.provider.timeout}"/><!-- dubbo注册到zookeeper,用于预发布或生产环境 --><!-- <dubbo:registry protocol="zookeeper" address="${zookeeper.addr}" /> --><!-- dubbo不注册到任何registry,用于开发或测试环境--><dubbo:registry protocol="zookeeper" address="N/A" /><dubbo:service ref="dubboServiceTest" interface="com.hjz.dubbo.api.DubboServiceTest"/>
</beans>

  由于是提供者作为一个web项目,所以web.xml文件如下。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_2_5.xsd"version="2.5" xmlns="http://xmlns.jcp.org/xml/ns/javaee"><display-name>hjz-dubbo-provider</display-name><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:dubbo-provider-example.xml</param-value></context-param><context-param><param-name>log4jConfigLocation</param-name><param-value>classpath:log4j.properties</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><welcome-file-list></welcome-file-list>
</web-app>

  4.dubbo服务消费者配置

  dubbo服务消费者测试类

package com.hjz.dubbo.consumer;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import com.alibaba.dubbo.common.logger.Logger;
import com.alibaba.dubbo.common.logger.LoggerFactory;
import com.hjz.dubbo.api.DubboServiceTest;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:dubbo-consumer-example.xml"})
public class DubboServiceConsumer {private static final Logger logger = LoggerFactory.getLogger(DubboServiceConsumer.class);@Autowiredprivate DubboServiceTest dubboServiceTest;@Testpublic void consumer(){int a = 4, b = 5;logger.info("消费dubbo服务....................");logger.info(String.format("a = %d, b = %d, a+b = %d", a, b, dubboServiceTest.calculate(a, b)));}
}

  dubbo服务消费者配置:dubbo-consumer-example.xml

<?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:context="http://www.springframework.org/schema/context"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><description>dubbo公共配置</description><context:property-placeholder location="classpath:dubbo-example.properties" /><!-- 同一个工程只配置一份即可 --><dubbo:application name="hjz-dubbo" owner="hjzgg"/><!-- 服务应用方调用的超时时间。默认不配置,则以服务提供方的超时时间为准。check为false表示延迟加载dubbo依赖的服务--><dubbo:consumer retries="0" timeout="${dubbo.consumer.timeout}" check="false"/><!-- dubbo注册到zookeeper,用于预发布或生产环境 --><!-- <dubbo:registry protocol="zookeeper" address="${zookeeper.addr}" /> --><!-- 像引用spring的bean服务一样引用dubbo提供的接口,用于预发布和生产环境--><!-- <dubbo:reference id="dubboServiceTest"  interface="com.hjz.dubbo.api.DubboServiceTest" /> --><!-- dubbo直连方式,只用于开发或测试阶段 --><dubbo:reference id="dubboServiceTest"  interface="com.hjz.dubbo.api.DubboServiceTest" url="dubbo://127.0.0.1:20880" />
</beans>

四、dubbo测试

  首先启动dubbo生产者,然后运行消费者的测试类,可以看到控制台中有如下信息输出:

2016-09-25 19:36:08,502 INFO [com.hjz.dubbo.consumer.DubboServiceConsumer] -  [DUBBO] 消费dubbo服务...................., dubbo version: 2.8.4, current host: 192.168.80.4
2016-09-25 19:36:08,761 INFO [com.hjz.dubbo.consumer.DubboServiceConsumer] -  [DUBBO] a = 4, b = 5, a+b = 9, dubbo version: 2.8.4, current host: 192.168.80.4

五、总结

  1.如果一个工程中有dubbo消费者,也有dubbo生产者,则<dubbo:application name="hjz-dubbo" owner="hjzgg"/>配置只有一个就可以了。

  2.测试环境一般采用dubbo直联方式,生产环境一般将dubbo服务注册到zookeeper。

  3.配置文件中 dubbo:reference id="dubboServiceTest"  和 dubbo:service ref="dubboServiceTest", id和ref的对应的value要一致。

  4.配置文件中 dubbo:service ref="dubboServiceTest",ref对应的value是服务的名称,例如@Service("dubboServiceTest")。

  5.如果抛出下面异常,

com.caucho.hessian.client.HessianRuntimeException: com.caucho.hessian.io.HessianFieldException: com.shine.ermp.dto.UserAccountDTO.invalidDate:
java.sql.Timestamp cannot be assigned from null  

   dubbo服务提供者的配置文件中加上下面红色的代码。

<dubbo:protocol  name="dubbo" port="20880" serialization="java"/>

六、测试demo

  https://github.com/hjzgg/dubbo_demo

  注:测试demo工程是个maven工程,eclipse可以通过 Check out as Maven Project from SCM 来导入即可,URL:https://github.com/hjzgg/dubbo_demo.git

转载于:https://www.cnblogs.com/hujunzheng/p/5907035.html

dubbo服务提供与消费相关推荐

  1. Dubbo服务正常发布,但消费不到的问题,也有可能是没有正确发布

    参考文章:https://blog.csdn.net/aq_112700/article/details/82950046 使用dubbo实现分布式, 但是很多时候程序都是对的,但是因为某些方面没有注 ...

  2. 【总结】dubbo 服务注册消费正常,但调用失败

    问题描述 dubbo 服务正常注册和消费,但调用dubbo 服务时报错.错误信息如下: org.apache.dubbo.rpc.RpcException: Failed to invoke the ...

  3. 我眼中的服务提供和服务消费

    服务提供和消费脑图 服务提供和消费脑图 参见: 服务提供者, 服务消费者, 服务注册中心 服务提供者 1.服务提供者启动,解析xml文件中配置的服务,这里使用Dom4j解析. 2.将服务的一些相关信息 ...

  4. php dubbo 接口测试工具,dubbo服务自动化测试搭建

    java实现dubbo的消费者服务编写:ruby实现消费者服务的接口测试:通过消费者间接测试dubbo服务接口的逻辑 内容包括:dubbo服务本地调用环境搭建,dubbo服务启动,消费者部署,脚本编写 ...

  5. Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)

    前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...

  6. spring整合dubbo服务消费和发现入门示例

    文章目录 准备 公共接口部分 服务提供 服务消费 准备 1.启动zookeeper 目录 其中interface包下是公共接口 测试预期结果: 订单服务web模块在A服务器,用户服务模块在B服务器,A ...

  7. 源码分析Dubbo服务消费端启动流程

    通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生 ...

  8. 对外提供dubbo服务的最佳实践

    为什么80%的码农都做不了架构师?>>>    模块介绍 share 所有需要对外开放的接口定义以及DTO client 对外提供的jar包, 需要调用本项目dubbo服务的应用, ...

  9. 无锡金秋购物节 淘菜菜提供社区消费全景式服务

    10月1日-3日,江苏省无锡市政府举办"无锡太湖(金秋)购物节",通过线上线下融合,为市民带来多元丰富的消费体验.作为此次入选政府合作的社区电商平台,淘菜菜直连近万个农产品基地和1 ...

最新文章

  1. 那年高考“坑爹“的金思力
  2. Python OpenCV学习笔记之:使用Grabcut算法进行图像背景和前景分割
  3. 就业阶段-java语言进价_day04
  4. iPhone 12系列电池容量曝光:不仅没增加竟还在缩水
  5. 快看漫画个性化推荐探索与实践.pdf(附下载链接)
  6. 【渝粤教育】国家开放大学2018年春季 0111-22T妇产科护理学 参考试题
  7. [软件更新]迅雷v5.9.8.1084发布
  8. ASP.NET MVC 4 笔记
  9. Turbo C 2.0安装及其使用
  10. 固态硬盘测试软件有哪些,SSD测试软件有哪些?SSD测试软件盘点
  11. setImageResource和setImageDrawable和setImageBitMap区别
  12. 优秀的论文答辩PPT模板值得被应用
  13. Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
  14. carla--使用python进行carla交互仿真
  15. IB成绩该如何换算GPA?
  16. ArrayList删除元素的细则
  17. twrp扩大system分区_TWRP recovery 的备份功能里面有 2 个 system 分区,多占用空间,怎么搞掉?...
  18. Ncut源码编译错误的解决方法
  19. 考研数据结构复试题目整理
  20. 2020年:maven配置最新阿里云镜像,以及在IDEA中的设置

热门文章

  1. python中异常和错误是同一个概念吗_Python 错误与异常
  2. rl滤波器原理_滤波器基本原理.ppt
  3. caas k8s主控节点如何查询_k8s--04 部署harbor作为k8s镜像仓库
  4. SpringBoot入门到精通_第6篇 _必知必会
  5. IDEA Maven项目左边栏只能看到pom文件
  6. html5怎么设置字体闪动,HTML最简单的文字闪烁代码
  7. html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图
  8. linux下文件颜色说明
  9. C语言 文件读写 fseek 函数 - C语言零基础入门教程
  10. Python map 函数 - Python零基础入门教程