dubbo使用教程(可直接应用于企业开发)

article/2025/9/9 15:04:54

        本dubbo使用教程基于zookeeper-3.4.9搭建,包含服务提供者DubboProvider、和消费者DubboConsumer,可直接在Tomcat上运行。DubboProvider对外开放2个接口,DubboConsumer调用DubboProvider,并对外暴露HTTP服务。DubboProvider还提供了对数据库的操作,基于SpringJDBC并加入了RowMapper通用类,这点在下文《SpringJDBC之RowMapper通用类》详讲。

        项目完整源码见文末链接,下载即可用

        网上现有教程大多是直接照搬官网,用main函数启动,未使用Tomcat启动,直接应用于企业开发较为困难。当然我也是参照官网,学习了前辈的经验,哈哈。

        开发环境:Windows10、Eclipse、JDK8、Spring4.3.7、zookeeper-3.4.9。

1、服务提供者DubboProvider

先看下整体架构,折叠部分为基于SpringJDBC的数据库操作,可暂不考虑。

1.1 定义接口IProviderService和接口IUserService

package com.zxiaofan.dubboProvidder.service;import com.zxiaofan.dubboProvidder.model.HelloBo;/*** * @author xiaofan*/
public interface IProviderService {/*** 测试字符串传输.* * @param name* @return*/String helloBoy(String name);/*** 测试bean传输.* * @param bo* @return*/HelloBo helloGirl(HelloBo bo);
}
接口IUserService略过,详见源码。

1.2 接口IProviderService实现

package com.zxiaofan.dubboProvidder.service.impl;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import com.zxiaofan.dubboProvidder.model.HelloBo;
import com.zxiaofan.dubboProvidder.service.IProviderService;/*** * @author xiaofan*/
@Component("providerService")
public class ProviderServiceImpl implements IProviderService {@Value("${param.url}")private String url;/*** {@inheritDoc}.*/@Overridepublic String helloBoy(String name) {String result = "hello " + name + ", This is dubboProvider[" + url + "]";System.out.println(result);return result;}/*** {@inheritDoc}.*/@Overridepublic HelloBo helloGirl(HelloBo helloBo) {if (null == helloBo.getName()) {helloBo.setName("DefaultName");}helloBo.setUrl(helloBo.getName() + ":This is dubboProvider[csdn.zxiaofan.com]");return helloBo;}}

1.3 dubbo-provider的相关参数配置

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd  http://code.alibabatech.com/schema/dubbo  http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 提供方应用信息,用于计算依赖关系 --><dubbo:application name="${dubbo.applicationName}" /><!-- 使用zookeeper广播注册中心暴露服务地址 --><dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}" /><!-- 用dubbo协议在20880端口暴露服务 --><dubbo:protocol name="dubbo" port="${dubbo.port}" /><!-- <dubbo: protocol="registry"></dubbo:monitor> --><!-- 和本地bean一样实现服务 --><bean id="providerService" class="com.zxiaofan.dubboProvidder.service.impl.ProviderServiceImpl" /><!-- 和本地bean一样实现服务 --><bean id="userService" class="com.zxiaofan.dubboProvidder.service.impl.UserServiceImpl" />	<!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.zxiaofan.dubboProvidder.service.IProviderService"ref="providerService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/><!-- 声明需要暴露的服务接口 --><dubbo:service interface="com.zxiaofan.dubboProvidder.service.IUserService"ref="userService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>
</beans>
结合配置文件dubbo.properties来看
# dubbo param
dubbo.applicationName=dubboProvider
dubbo.registryProtocol=zookeeper
dubbo.registryAddress=127.0.0.1:2181
dubbo.port=20880
#服务端超过serverTimeout未返回结果则抛500异常
dubbo.serverTimeout=120000
#客户端超过clientTimeout未获取到数据则抛500异常
dubbo.clientTimeout=120000
#dubbo调用失败,默认重试2次
dubbo.retries=0
    <bean id="providerService" class="com.zxiaofan.dubboProvidder.service.impl.ProviderServiceImpl" />声明了对外暴露的接口;
<dubbo:service interface="com.zxiaofan.dubboProvidder.service.IProviderService"
ref="providerService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>声明了接口的实现类以及重试次数、服务超时时间。

1.4 app-context.xml 以及 web.xml 相关配置

    app-context.xml指定包扫描路径以及引入相关配置文件和dubbo-provider.xml。
<beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><list><value>/WEB-INF/config/param.properties</value><value>/WEB-INF/config/dubbo.properties</value><value>/WEB-INF/config/jdbc.properties</value></list></property><property name="fileEncoding" value="UTF8"></property></bean><beanclass="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" /><!-- Aspect -->
<!--	<aop:aspectj-autoproxy proxy-target-class="true" />--><context:component-scan base-package="com.zxiaofan"></context:component-scan><import resource="classpath:com/zxiaofan/config/spring/dubbo-provider.xml"/>
web.xml一定要引入app-context.xml以及设置监听ContextLoaderListener。
<context-param><param-name>contextConfigLocation</param-name><param-value>classpath:/com/zxiaofan/config/spring/app-context.xml</param-value></context-param><!--初始化spring上下文 --><listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener>

2、消费者DubboConsumer

整体架构如下:

2.1 定义接口IConsumerService

package com.zxiaofan.dubboConsumer.service;/*** * @author zxiaofan*/
public interface IConsumerService {String hi(String name);
}

2.2 接口实现类ConsumerServiceImpl

package com.zxiaofan.dubboConsumer.service.impl;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;import com.zxiaofan.dubboConsumer.service.IConsumerService;
import com.zxiaofan.dubboProvidder.model.HelloBo;
import com.zxiaofan.dubboProvidder.service.IProviderService;
import com.zxiaofan.dubboProvidder.service.IUserService;/*** * @author zxiaofan*/
@Component("consumerService")
public class ConsumerServiceImpl implements IConsumerService {@Resource(name = "providerService")private IProviderService providerService;@Resource(name = "userService")private IUserService userService;@Value("${param.url}")private String url;/*** {@inheritDoc}.*/@Overridepublic String hi(String name) {String result = null;if (null != name && name.startsWith("boy")) {System.out.println("Hi Boy!");result = providerService.helloBoy(name.replace("boy", "~~~"));} else if (null != name && name.startsWith("select")) {System.out.println("hi select!");result = userService.selectByID(name.replace("select", ""));return result;} else {HelloBo helloBo = new HelloBo();helloBo.setName(name);HelloBo helloBoResult = null;helloBoResult = providerService.helloGirl(helloBo);if (null != helloBoResult) {result = helloBoResult.getUrl();}}result += "; This is dubboConsumer[" + url + "]";return result;}}
总共有3个分支:
name.startsWith("boy"),跳转helloBoy,其入参是单个字符串;
name.startsWith("select"),跳转userService.selectByID,该接口调用服务提供者的IUserService接口,对数据库进行查询操作;
else:跳转helloGirl接口,其入参是model。

2.3 dubbo-consumer的相关参数配置

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.3.xsd  http://code.alibabatech.com/schema/dubbo  http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --><dubbo:application name="${dubbo.applicationName}"/><!-- 使用dubbo协议   注册中心暴露服务地址 --><dubbo:registry protocol="${dubbo.registryProtocol}"  address="${dubbo.registryAddress}"/><!-- 生成远程服务代理,可以像使用本地bean一样使用demoService --><dubbo:reference id="providerService" interface="com.zxiaofan.dubboProvidder.service.IProviderService"  retries="${dubbo.retries}"  timeout="${dubbo.clientTimeout}"/><dubbo:reference id="userService" interface="com.zxiaofan.dubboProvidder.service.IUserService"  retries="${dubbo.retries}"  timeout="${dubbo.clientTimeout}"/>
</beans>
该配置文件配置了2个服务的调用关系:providerService(入参为单字符串接口、入参为model接口)、userService(基于SpringJDBC的数据库服务)。

2.4 web.xml节选

 <!--  <listener><listener-class>org.springframework.web.util.Log4jConfigListener</listener-class></listener> --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:/com/zxiaofan/config/spring/app-context.xml</param-value></context-param><!--初始化spring上下文 --><listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  </listener><!-- 必须有servlet --><servlet><servlet-name>HttpServer</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/com/zxiaofan/config/spring/httpServer-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet> <servlet-mapping><servlet-name>HttpServer</servlet-name><url-pattern>/*</url-pattern></servlet-mapping>
引入app-context.xml,监听ContextLoaderListener,注意加上servlet,方便暴露HTTP服务。

3、注册中心zookeeper

zookeeper可从官网下载,亦可从此处免费下载: http://download.csdn.net/detail/u010887744/9787895

4、 服务使用

4.1 启动注册中心

Windows下双击zookeeper-3.4.9\bin下的zkServer.cmd即可直接启动,linux下则启动zkServer.sh即可。如果你是从官网下载的原生zookeeper,还得手动修改配置文件zoo_sample.cfg,复制一份命名为zoo.cfg即可。启动成功会看到如下画面:


4.2、启动DubboProvider

启动成功后,会在注册中心看到注册信息,包含了我们注册的2个接口信息。注意不要被上面的Error:KeeperErrorCode = NodeExists for 误导了,这是正常的,不用理会。

4.3、 启动DubboConsumer

建议新开一个Tomcat,专门用来启动DubboConsumer,注意需要修改相关端口号哦,比如这里修改HTTP端口为8010,另外2个端口也要修改,避免冲突。
测试第1个接口的第1个方法:单个字符串参数,HTTP服务地址: http://localhost:8010/DubboConsumer/api,参数csdn,结果如下,返回值包含了DubboConsumer、和DubboProvider添加的信息,证明服务是OK的。
测试第1个接口的第2个方法,dubboProvider的入参是model(dubboConsumer入参记得以boy开头哦)。
测试第2个接口的方法,dubboProvider的数据操作(dubboConsumer入参记得以select开头哦,select后拼接数据库中的id字段)。
Note:\dubbo\DubboProvider\test\com\zxiaofan\test\config\initDB.sql有建库建表的SQL,可直接使用。
最后放大招, 项目源码地址:https://github.com/zxiaofan/OpenSource_Study/tree/master/dubbo,项目OpenSource_Study下包含了本人各类开源软件、框架学习的相关demo,包含Apache、Thrift、Guava、quartz等项目,持续学习ing。
有任何问题,欢迎留言讨论。
欢迎个人转载,但须在文章页面明显位置给出原文连接;
未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。【 CSDN 】:csdn.zxiaofan.com
【GitHub】:github.zxiaofan.com如有任何问题,欢迎留言。祝君好运!
Life is all about choices! 
将来的你一定会感激现在拼命的自己!

http://chatgpt.dhexx.cn/article/jHAKnF2I.shtml

相关文章

Dubbo快速入门

前言&#xff1a;本文需要建立在博主的环境之上来进行&#xff0c;大家也可以用自己的环境测试一下看能不能行得通&#xff0c;如果可以的话请在下方评论&#xff0c;让更多的人知道 Jdk&#xff1a;11 Springboot版本&#xff1a;2.6.6 Dubbo版本&#xff1a;0.2.0&#xf…

dubbo最全的使用教程

dubbo是阿里一款高性能&#xff0c;轻量级的rpc框架&#xff0c;有两大核心功能&#xff1a;远程服务调用和服务治理。本文主要介绍dubbo的运用。 一&#xff0c;安装注册中心zookeeper 1&#xff0c;为什么需要注册中心&#xff0c;不要能不能远程服务调用 答&#xff1a;可以…

VS2017安装教程(详细版)

1.首先下载好安装包 百度网盘下载链接 链接&#xff1a;https://pan.baidu.com/s/1HW8hrLMazRsBkPvkDHkD1Q?pwdz4jg 提取码&#xff1a;z4jg 2.下载到桌面以管理员身份运行 点击继续 3.进入后更改安装位置&#xff0c;选择安装路径&#xff0c;千万不要安装到C盘 4.改完后…

vs2017秘钥

vs2017 企业版秘钥&#xff1a;NJVYC-BMHX2-G77MM-4XJMR-6Q8QF 专业版秘钥&#xff1a;KBJFW-NXHK6-W4WJM-CRMQB-G3CDH 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章…

自定义 Tabhost 样式

经过了一天的折腾, 在网上也找了不少源码&#xff0c; 但是效果都不是很好&#xff0c;非常长&#xff0c; 最后自己终于写出了一个代码不是很多的Tabhost。 先上图(背景是随便弄的, 所以不怎么样) 首先&#xff0c; 我们要先写一个主xml main.xml 每一个LinearLayout代表…

tabHost 使用方法

近日 学习TabHost的使用 再网上搜不少文章 觉得这篇写的挺好 &#xff01; 出处 &#xff1a;http://www.blogjava.net/freeman1984/archive/2010/10/29/302803.html 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; priv…

android Tabhost控件的使用

Tabhost用来实现如图的效果&#xff1a; 上图的首页、自选、警报是由Tabhost控件来实现的&#xff0c;Tabhost控件中的每个tab其实都是一个Activity&#xff0c;也就是说我创建一个Tabhost&#xff0c;在tabhost中添加tab页就可以实现。 实现方式&#xff1a;1、创建布局文件 …

TabHost详解0

一、TabHost是一个选项卡容器&#xff0c;通过标签页将多个Activity整合到一起。 TabHost的三要素为&#xff1a;TabWidget、FrameLayout、List<TabSpec>。 其主要的使用方式有两种&#xff1a; 1.继承TabActivity&#xff0c;结合对应的xml配置文件导入tab选项内容体 …

TabHost

TabHost的实现有两种方式&#xff0c;第一种继承TabActivity&#xff0c;从TabActivity中用getTabHost()方法获取TabHost。各个Tab中的内容在布局文件中定义就行了。 mainActivity.xml private TabHost myTabHost;Overridepublic void onCreate(Bundle savedInstanceState) {su…

Android初级控件TabHost

TabHost我们都知道是用来实现导航栏布局来切换页面的&#xff0c;这个也是元老级的控件了&#xff0c;现在逐渐被TabLayout,BottomNavigationBar,使用RadioButton自定义。。。等等给取代了。TabHost有个好处就是它添加的是Activity而不像上面那些全部使用Fragment来显示内容。 …

Android中TabHost嵌套TabHost

在嵌套TabHost时&#xff0c;先后遇到了以下情况&#xff1a; 问题1&#xff1a;内部TabHos无显示&#xff0c;只显示了其中的一个Activity&#xff1b; 解决&#xff1a;按下文比对主子TabHos的布局文件和java文件并修改&#xff1b; 问题2&#xff1a;如上所做后&#xff…

Android的Tab与TabHost讲解

在Android应用中&#xff0c;经常会用到TabHost选项卡,可以方便地在不同页面间切换。之前看过网上的一些教程&#xff0c;但大多都是一个形式&#xff0c;看得迷迷糊糊&#xff0c;不能让人很好的理解和学习。所以&#xff0c;在此详细地列出了Tab与TabHost的使用方法&#xff…

Android - TabHost 选项卡功能用法详解

一、实例 二.、TabHost介绍 TabHost组件可以在界面中存放多个选项卡, 很多软件都使用了改组件进行设计; 1. TabHost常用组件 TabWidget : 该组件就是TabHost标签页中上部 或者 下部的按钮, 可以点击按钮切换选项卡; TabSpec : 代表了选项卡界面, 添加一个TabSpec即可添加到TabH…

【转】TabHost详解

请大家尊重作者版权&#xff0c;转载请标明出处&#xff1a;http://blog.csdn.net/harvic880925/article/details/17120325 前言&#xff1a;今天仔细研究了下TabHost&#xff0c;主要是为了实现微信底部导航栏的功能&#xff0c;最后也给出一个链接&#xff0c;这位老兄用TabH…

Android入门第十一篇之TabHost,TabWidget

本文来自http://blog.csdn.net/hellogv/ &#xff0c;引用必须注明出处&#xff01; 这回要介绍的是Android的Tab控件&#xff0c;Tab控件可以达到分页的效果&#xff0c;让一个屏幕的内容尽量丰富&#xff0c;当然也会增加开发的复杂程度&#xff0c;在有必要的时候再使用。An…

android Tabhost部件

本文结合源代码和实例来说明TabHost的用法。 使用TabHost 可以在一个屏幕间进行不同版面的切换&#xff0c;例如android自带的拨号应用&#xff0c;截图&#xff1a; 查看tabhost的源代码&#xff0c;主要实例变量有&#xff1a; private TabWidget mTabWidget; …

TabHost的用法

http://blog.csdn.net/lastsweetop/article/details/5566200 本文结合源代码和实例来说明TabHost的用法。 使用TabHost 可以在一个屏幕间进行不同版面的切换&#xff0c;例如android自带的拨号应用&#xff0c;截图&#xff1a; 查看tabhost的源代码&#xff0…

ViewPager和Tabhost结合,可滑动的tabhost

有朋友反映资源下载下来有问题&#xff0c;我看了下&#xff0c;确实是&#xff0c;已更新下面文章中的代码和资源&#xff0c;现在可以好好的跑起来了&#xff0c;另外还改动了个小地方的逻辑&#xff0c;因为我在使用中出了点小错&#xff0c;需要的可以试下。另外&#xff0…

TabSpec和TabHost实例

TabSpec与TabHost TabHost相当于浏览器中浏览器分布的集合&#xff0c;而Tabspec则相当于浏览器中的每一个分页面。d在Android中&#xff0c;每一个TabSpec分布可以是一个组件&#xff0c;也可以是一个布局&#xff0c;然后将每一个分页装入TabHost中&#xff0c;TabHost即可将…

Android中的TabHost

介绍 有时&#xff0c;我们想在一个window中显示多个视图&#xff0c;这时就需要用到Tab容器。在Android里它叫TabHost。 使用TabHost有两种方式&#xff1a; 在相同的activity中使用TabHost导航多个视图使用TabHost导航多个Activity(通过intents) Tab应用的结构 TabHost的A…