dubbo服务提供与消费
一、前言
项目中用到了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服务提供与消费相关推荐
- Dubbo服务正常发布,但消费不到的问题,也有可能是没有正确发布
参考文章:https://blog.csdn.net/aq_112700/article/details/82950046 使用dubbo实现分布式, 但是很多时候程序都是对的,但是因为某些方面没有注 ...
- 【总结】dubbo 服务注册消费正常,但调用失败
问题描述 dubbo 服务正常注册和消费,但调用dubbo 服务时报错.错误信息如下: org.apache.dubbo.rpc.RpcException: Failed to invoke the ...
- 我眼中的服务提供和服务消费
服务提供和消费脑图 服务提供和消费脑图 参见: 服务提供者, 服务消费者, 服务注册中心 服务提供者 1.服务提供者启动,解析xml文件中配置的服务,这里使用Dom4j解析. 2.将服务的一些相关信息 ...
- php dubbo 接口测试工具,dubbo服务自动化测试搭建
java实现dubbo的消费者服务编写:ruby实现消费者服务的接口测试:通过消费者间接测试dubbo服务接口的逻辑 内容包括:dubbo服务本地调用环境搭建,dubbo服务启动,消费者部署,脚本编写 ...
- Dubbo源码解析-Dubbo服务消费者_Dubbo协议(一)
前言: 在介绍完Dubbo 本地模式(Injvm协议)下的服务提供与消费后,上文我们又介绍了Dubbo远程模式(dubbo协议)下的服务暴露过程,本质上就是通过Netty将dubbo协议端口暴露出去, ...
- spring整合dubbo服务消费和发现入门示例
文章目录 准备 公共接口部分 服务提供 服务消费 准备 1.启动zookeeper 目录 其中interface包下是公共接口 测试预期结果: 订单服务web模块在A服务器,用户服务模块在B服务器,A ...
- 源码分析Dubbo服务消费端启动流程
通过前面文章详解,我们知道Dubbo服务消费者标签dubbo:reference最终会在Spring容器中创建一个对应的ReferenceBean实例,而ReferenceBean实现了Spring生 ...
- 对外提供dubbo服务的最佳实践
为什么80%的码农都做不了架构师?>>> 模块介绍 share 所有需要对外开放的接口定义以及DTO client 对外提供的jar包, 需要调用本项目dubbo服务的应用, ...
- 无锡金秋购物节 淘菜菜提供社区消费全景式服务
10月1日-3日,江苏省无锡市政府举办"无锡太湖(金秋)购物节",通过线上线下融合,为市民带来多元丰富的消费体验.作为此次入选政府合作的社区电商平台,淘菜菜直连近万个农产品基地和1 ...
最新文章
- 那年高考“坑爹“的金思力
- Python OpenCV学习笔记之:使用Grabcut算法进行图像背景和前景分割
- 就业阶段-java语言进价_day04
- iPhone 12系列电池容量曝光:不仅没增加竟还在缩水
- 快看漫画个性化推荐探索与实践.pdf(附下载链接)
- 【渝粤教育】国家开放大学2018年春季 0111-22T妇产科护理学 参考试题
- [软件更新]迅雷v5.9.8.1084发布
- ASP.NET MVC 4 笔记
- Turbo C 2.0安装及其使用
- 固态硬盘测试软件有哪些,SSD测试软件有哪些?SSD测试软件盘点
- setImageResource和setImageDrawable和setImageBitMap区别
- 优秀的论文答辩PPT模板值得被应用
- Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
- carla--使用python进行carla交互仿真
- IB成绩该如何换算GPA?
- ArrayList删除元素的细则
- twrp扩大system分区_TWRP recovery 的备份功能里面有 2 个 system 分区,多占用空间,怎么搞掉?...
- Ncut源码编译错误的解决方法
- 考研数据结构复试题目整理
- 2020年:maven配置最新阿里云镜像,以及在IDEA中的设置
热门文章
- python中异常和错误是同一个概念吗_Python 错误与异常
- rl滤波器原理_滤波器基本原理.ppt
- caas k8s主控节点如何查询_k8s--04 部署harbor作为k8s镜像仓库
- SpringBoot入门到精通_第6篇 _必知必会
- IDEA Maven项目左边栏只能看到pom文件
- html5怎么设置字体闪动,HTML最简单的文字闪烁代码
- html5 coverflow,使用FancyCoverFlow实现3D无限循环切换视图
- linux下文件颜色说明
- C语言 文件读写 fseek 函数 - C语言零基础入门教程
- Python map 函数 - Python零基础入门教程