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

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



目录(?)[+]

        本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

[java] view plain copy
  1. package com.zxiaofan.dubboProvidder.service;  
  2.   
  3. import com.zxiaofan.dubboProvidder.model.HelloBo;  
  4.   
  5. /** 
  6.  *  
  7.  * @author xiaofan 
  8.  */  
  9. public interface IProviderService {  
  10.     /** 
  11.      * 测试字符串传输. 
  12.      *  
  13.      * @param name 
  14.      * @return 
  15.      */  
  16.     String helloBoy(String name);  
  17.   
  18.     /** 
  19.      * 测试bean传输. 
  20.      *  
  21.      * @param bo 
  22.      * @return 
  23.      */  
  24.     HelloBo helloGirl(HelloBo bo);  
  25. }  
接口IUserService略过,详见源码。

1.2 接口IProviderService实现

[java] view plain copy
  1. package com.zxiaofan.dubboProvidder.service.impl;  
  2.   
  3. import org.springframework.beans.factory.annotation.Value;  
  4. import org.springframework.stereotype.Component;  
  5.   
  6. import com.zxiaofan.dubboProvidder.model.HelloBo;  
  7. import com.zxiaofan.dubboProvidder.service.IProviderService;  
  8.   
  9. /** 
  10.  *  
  11.  * @author xiaofan 
  12.  */  
  13. @Component("providerService")  
  14. public class ProviderServiceImpl implements IProviderService {  
  15.     @Value("${param.url}")  
  16.     private String url;  
  17.   
  18.     /** 
  19.      * {@inheritDoc}. 
  20.      */  
  21.     @Override  
  22.     public String helloBoy(String name) {  
  23.         String result = "hello " + name + ", This is dubboProvider[" + url + "]";  
  24.         System.out.println(result);  
  25.         return result;  
  26.     }  
  27.   
  28.     /** 
  29.      * {@inheritDoc}. 
  30.      */  
  31.     @Override  
  32.     public HelloBo helloGirl(HelloBo helloBo) {  
  33.         if (null == helloBo.getName()) {  
  34.             helloBo.setName("DefaultName");  
  35.         }  
  36.         helloBo.setUrl(helloBo.getName() + ":This is dubboProvider[csdn.zxiaofan.com]");  
  37.         return helloBo;  
  38.     }  
  39.   
  40. }  

1.3 dubbo-provider的相关参数配置

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.     http://www.springframework.org/schema/beans/spring-beans-4.3.xsd    
  6.     http://code.alibabatech.com/schema/dubbo    
  7.     http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.   
  9.     <!-- 提供方应用信息,用于计算依赖关系 -->  
  10.     <dubbo:application name="${dubbo.applicationName}" />  
  11.   
  12.     <!-- 使用zookeeper广播注册中心暴露服务地址 -->  
  13.     <dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}" />  
  14.   
  15.     <!-- 用dubbo协议在20880端口暴露服务 -->  
  16.     <dubbo:protocol name="dubbo" port="${dubbo.port}" />  
  17.     <!-- <dubbo: protocol="registry"></dubbo:monitor> -->  
  18.   
  19.       
  20.     <!-- 和本地bean一样实现服务 -->  
  21.     <bean id="providerService" class="com.zxiaofan.dubboProvidder.service.impl.ProviderServiceImpl" />  
  22.     <!-- 和本地bean一样实现服务 -->  
  23.     <bean id="userService" class="com.zxiaofan.dubboProvidder.service.impl.UserServiceImpl" />      
  24.     <!-- 声明需要暴露的服务接口 -->  
  25.     <dubbo:service interface="com.zxiaofan.dubboProvidder.service.IProviderService"  
  26.         ref="providerService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>  
  27.     <!-- 声明需要暴露的服务接口 -->  
  28.     <dubbo:service interface="com.zxiaofan.dubboProvidder.service.IUserService"  
  29.         ref="userService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>  
  30. </beans>  
结合配置文件dubbo.properties来看
[plain] view plain copy
  1. # dubbo param  
  2. dubbo.applicationName=dubboProvider  
  3. dubbo.registryProtocol=zookeeper  
  4. dubbo.registryAddress=127.0.0.1:2181  
  5. dubbo.port=20880  
  6. #服务端超过serverTimeout未返回结果则抛500异常  
  7. dubbo.serverTimeout=120000  
  8. #客户端超过clientTimeout未获取到数据则抛500异常  
  9. dubbo.clientTimeout=120000  
  10. #dubbo调用失败,默认重试2次  
  11. 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。
[html] view plain copy
  1. <bean  
  2.         class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.         <property name="locations">  
  4.             <list>  
  5.                 <value>/WEB-INF/config/param.properties</value>  
  6.                 <value>/WEB-INF/config/dubbo.properties</value>  
  7.                 <value>/WEB-INF/config/jdbc.properties</value>  
  8.             </list>  
  9.         </property>  
  10.         <property name="fileEncoding" value="UTF8"></property>  
  11.     </bean>  
  12.     <bean  
  13.         class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />  
  14.   
  15.     <!-- Aspect -->  
  16. <!-- <aop:aspectj-autoproxy proxy-target-class="true" />-->  
  17.     <context:component-scan base-package="com.zxiaofan"></context:component-scan>  
  18.     <import resource="classpath:com/zxiaofan/config/spring/dubbo-provider.xml"/>  
web.xml一定要引入app-context.xml以及设置监听ContextLoaderListener。
[html] view plain copy
  1. <context-param>  
  2.         <param-name>contextConfigLocation</param-name>  
  3.         <param-value>  
  4.             classpath:/com/zxiaofan/config/spring/app-context.xml  
  5.          </param-value>  
  6.   </context-param>  
  7.    <!--初始化spring上下文 -->  
  8.     <listener>    
  9.       <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  10.     </listener>  

2、消费者DubboConsumer

整体架构如下:


2.1 定义接口IConsumerService

[java] view plain copy
  1. package com.zxiaofan.dubboConsumer.service;  
  2.   
  3. /** 
  4.  *  
  5.  * @author zxiaofan 
  6.  */  
  7. public interface IConsumerService {  
  8.     String hi(String name);  
  9. }  

2.2 接口实现类ConsumerServiceImpl

[java] view plain copy
  1. package com.zxiaofan.dubboConsumer.service.impl;  
  2.   
  3. import javax.annotation.Resource;  
  4.   
  5. import org.springframework.beans.factory.annotation.Value;  
  6. import org.springframework.stereotype.Component;  
  7.   
  8. import com.zxiaofan.dubboConsumer.service.IConsumerService;  
  9. import com.zxiaofan.dubboProvidder.model.HelloBo;  
  10. import com.zxiaofan.dubboProvidder.service.IProviderService;  
  11. import com.zxiaofan.dubboProvidder.service.IUserService;  
  12.   
  13. /** 
  14.  *  
  15.  * @author zxiaofan 
  16.  */  
  17. @Component("consumerService")  
  18. public class ConsumerServiceImpl implements IConsumerService {  
  19.     @Resource(name = "providerService")  
  20.     private IProviderService providerService;  
  21.   
  22.     @Resource(name = "userService")  
  23.     private IUserService userService;  
  24.   
  25.     @Value("${param.url}")  
  26.     private String url;  
  27.   
  28.     /** 
  29.      * {@inheritDoc}. 
  30.      */  
  31.     @Override  
  32.     public String hi(String name) {  
  33.         String result = null;  
  34.         if (null != name && name.startsWith("boy")) {  
  35.             System.out.println("Hi Boy!");  
  36.             result = providerService.helloBoy(name.replace("boy""~~~"));  
  37.         } else if (null != name && name.startsWith("select")) {  
  38.             System.out.println("hi select!");  
  39.             result = userService.selectByID(name.replace("select"""));  
  40.             return result;  
  41.         } else {  
  42.             HelloBo helloBo = new HelloBo();  
  43.             helloBo.setName(name);  
  44.             HelloBo helloBoResult = null;  
  45.             helloBoResult = providerService.helloGirl(helloBo);  
  46.             if (null != helloBoResult) {  
  47.                 result = helloBoResult.getUrl();  
  48.             }  
  49.         }  
  50.         result += "; This is dubboConsumer[" + url + "]";  
  51.         return result;  
  52.     }  
  53.   
  54. }  
总共有3个分支:
name.startsWith("boy"),跳转helloBoy,其入参是单个字符串;
name.startsWith("select"),跳转userService.selectByID,该接口调用服务提供者的IUserService接口,对数据库进行查询操作;
else:跳转helloGirl接口,其入参是model。

2.3 dubbo-consumer的相关参数配置

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5.     http://www.springframework.org/schema/beans/spring-beans-4.3.xsd    
  6.     http://code.alibabatech.com/schema/dubbo    
  7.     http://code.alibabatech.com/schema/dubbo/dubbo.xsd">  
  8.   
  9.       
  10.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->  
  11.     <dubbo:application name="${dubbo.applicationName}"/>  
  12.   
  13.     <!-- 使用dubbo协议   注册中心暴露服务地址 -->  
  14.     <dubbo:registry protocol="${dubbo.registryProtocol}"  address="${dubbo.registryAddress}"/>  
  15.   
  16.     <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->  
  17.     <dubbo:reference id="providerService" interface="com.zxiaofan.dubboProvidder.service.IProviderService"  retries="${dubbo.retries}"  timeout="${dubbo.clientTimeout}"/>  
  18.     <dubbo:reference id="userService" interface="com.zxiaofan.dubboProvidder.service.IUserService"  retries="${dubbo.retries}"  timeout="${dubbo.clientTimeout}"/>  
  19. </beans>  
该配置文件配置了2个服务的调用关系:providerService(入参为单字符串接口、入参为model接口)、userService(基于SpringJDBC的数据库服务)。

2.4 web.xml节选

[html] view plain copy
  1. <!--  <listener>  
  2.    <listener-class>  
  3.        org.springframework.web.util.Log4jConfigListener  
  4.      </listener-class>  
  5.  </listener> -->  
  6.   
  7.  <context-param>  
  8.     <param-name>contextConfigLocation</param-name>  
  9.     <param-value>  
  10.         classpath:/com/zxiaofan/config/spring/app-context.xml  
  11.      </param-value>  
  12.  </context-param>  
  13.    
  14.  <!--初始化spring上下文 -->  
  15. <listener>    
  16.      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  17. </listener>  
  18.   
  19. <!-- 必须有servlet -->  
  20.     <servlet>  
  21.     <servlet-name>HttpServer</servlet-name>  
  22.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  23.     <init-param>  
  24.         <param-name>contextConfigLocation</param-name>  
  25.         <param-value>  
  26.              classpath*:/com/zxiaofan/config/spring/httpServer-servlet.xml  
  27.            </param-value>  
  28.     </init-param>  
  29.     <load-on-startup>1</load-on-startup>  
  30. </servlet>   
  31. <servlet-mapping>  
  32.     <servlet-name>HttpServer</servlet-name>  
  33.     <url-pattern>/*</url-pattern>  
  34. </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。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值