当前位置:   article > 正文

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

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

1.2 接口IProviderService实现

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

1.3 dubbo-provider的相关参数配置

  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. <dubbo:application name="${dubbo.applicationName}" />
  10. <!-- 使用zookeeper广播注册中心暴露服务地址 -->
  11. <dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}" />
  12. <!-- 用dubbo协议在20880端口暴露服务 -->
  13. <dubbo:protocol name="dubbo" port="${dubbo.port}" />
  14. <!-- <dubbo: protocol="registry"></dubbo:monitor> -->
  15. <!-- 和本地bean一样实现服务 -->
  16. <bean id="providerService" class="com.zxiaofan.dubboProvidder.service.impl.ProviderServiceImpl" />
  17. <!-- 和本地bean一样实现服务 -->
  18. <bean id="userService" class="com.zxiaofan.dubboProvidder.service.impl.UserServiceImpl" />
  19. <!-- 声明需要暴露的服务接口 -->
  20. <dubbo:service interface="com.zxiaofan.dubboProvidder.service.IProviderService"
  21. ref="providerService" retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>
  22. <!-- 声明需要暴露的服务接口 -->
  23. <dubbo:service interface="com.zxiaofan.dubboProvidder.service.IUserService"
  24. ref="userService" retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>
  25. </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。
  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. <!-- Aspect -->
  15. <!-- <aop:aspectj-autoproxy proxy-target-class="true" />-->
  16. <context:component-scan base-package="com.zxiaofan"></context:component-scan>
  17. <import resource="classpath:com/zxiaofan/config/spring/dubbo-provider.xml"/>
web.xml一定要引入app-context.xml以及设置监听ContextLoaderListener。
  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

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

2.2 接口实现类ConsumerServiceImpl

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

2.3 dubbo-consumer的相关参数配置

  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. <dubbo:application name="${dubbo.applicationName}"/>
  10. <!-- 使用dubbo协议 注册中心暴露服务地址 -->
  11. <dubbo:registry protocol="${dubbo.registryProtocol}" address="${dubbo.registryAddress}"/>
  12. <!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
  13. <dubbo:reference id="providerService" interface="com.zxiaofan.dubboProvidder.service.IProviderService" retries="${dubbo.retries}" timeout="${dubbo.clientTimeout}"/>
  14. <dubbo:reference id="userService" interface="com.zxiaofan.dubboProvidder.service.IUserService" retries="${dubbo.retries}" timeout="${dubbo.clientTimeout}"/>
  15. </beans>
该配置文件配置了2个服务的调用关系:providerService(入参为单字符串接口、入参为model接口)、userService(基于SpringJDBC的数据库服务)。

2.4 web.xml节选

  1. <!-- <listener>
  2. <listener-class>
  3. org.springframework.web.util.Log4jConfigListener
  4. </listener-class>
  5. </listener> -->
  6. <context-param>
  7. <param-name>contextConfigLocation</param-name>
  8. <param-value>
  9. classpath:/com/zxiaofan/config/spring/app-context.xml
  10. </param-value>
  11. </context-param>
  12. <!--初始化spring上下文 -->
  13. <listener>
  14. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  15. </listener>
  16. <!-- 必须有servlet -->
  17. <servlet>
  18. <servlet-name>HttpServer</servlet-name>
  19. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  20. <init-param>
  21. <param-name>contextConfigLocation</param-name>
  22. <param-value>
  23. classpath*:/com/zxiaofan/config/spring/httpServer-servlet.xml
  24. </param-value>
  25. </init-param>
  26. <load-on-startup>1</load-on-startup>
  27. </servlet>
  28. <servlet-mapping>
  29. <servlet-name>HttpServer</servlet-name>
  30. <url-pattern>/*</url-pattern>
  31. </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。
        有任何问题,欢迎留言讨论。
  1. 欢迎个人转载,但须在文章页面明显位置给出原文连接;
  2. 未经作者同意必须保留此段声明、不得随意修改原文、不得用于商业用途,否则保留追究法律责任的权利。
  3. CSDN 】:csdn.zxiaofan.com
  4. GitHub】:github.zxiaofan.com
  5. 如有任何问题,欢迎留言。祝君好运!
  6. Life is all about choices!
  7. 将来的你一定会感激现在拼命的自己!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/166090
推荐阅读
相关标签
  

闽ICP备14008679号