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的数据库操作,可暂不考虑。
dubbo使用教程(可直接应用于企业开发)_第1张图片

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}.
     */
    @Override
    public String helloBoy(String name) {
        String result = "hello " + name + ", This is dubboProvider[" + url + "]";
        System.out.println(result);
        return result;
    }

    /**
     * {@inheritDoc}.
     */
    @Override
    public 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的相关参数配置




	
	

	
	

	
	
	

	
	
	
	
		
	
	
	
	
结合配置文件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
    声明了对外暴露的接口;
    ref="providerService"  retries="${dubbo.retries}" timeout="${dubbo.serverTimeout}"/>声明了接口的实现类以及重试次数、服务超时时间。

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

    app-context.xml指定包扫描路径以及引入相关配置文件和dubbo-provider.xml。

		
			
				/WEB-INF/config/param.properties
				/WEB-INF/config/dubbo.properties
				/WEB-INF/config/jdbc.properties
			
		
		
	
	

	

	
    
web.xml一定要引入app-context.xml以及设置监听ContextLoaderListener。

		contextConfigLocation
		
		    classpath:/com/zxiaofan/config/spring/app-context.xml
	     
  
   
	  
      org.springframework.web.context.ContextLoaderListener  
	

2、消费者DubboConsumer

整体架构如下:
dubbo使用教程(可直接应用于企业开发)_第2张图片

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}.
     */
    @Override
    public 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的相关参数配置




	
    
    

    
    

    
    
    
该配置文件配置了2个服务的调用关系:providerService(入参为单字符串接口、入参为model接口)、userService(基于SpringJDBC的数据库服务)。

2.4 web.xml节选

 
 
  
		contextConfigLocation
		
		    classpath:/com/zxiaofan/config/spring/app-context.xml
	     
  
  
	 
	  
      org.springframework.web.context.ContextLoaderListener  
	
	
	
 	
		HttpServer
		org.springframework.web.servlet.DispatcherServlet
		
			contextConfigLocation
			
			     classpath*:/com/zxiaofan/config/spring/httpServer-servlet.xml
            
		
		1
	 
	
		HttpServer
		/*
	
引入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即可。启动成功会看到如下画面:
dubbo使用教程(可直接应用于企业开发)_第3张图片


4.2、启动DubboProvider

        启动成功后,会在注册中心看到注册信息,包含了我们注册的2个接口信息。注意不要被上面的Error:KeeperErrorCode = NodeExists for 误导了,这是正常的,不用理会。
dubbo使用教程(可直接应用于企业开发)_第4张图片

4.3、 启动DubboConsumer

        建议新开一个Tomcat,专门用来启动DubboConsumer,注意需要修改相关端口号哦,比如这里修改HTTP端口为8010,另外2个端口也要修改,避免冲突。
        测试第1个接口的第1个方法:单个字符串参数,HTTP服务地址: http://localhost:8010/DubboConsumer/api,参数csdn,结果如下,返回值包含了DubboConsumer、和DubboProvider添加的信息,证明服务是OK的。
dubbo使用教程(可直接应用于企业开发)_第5张图片

测试第1个接口的第2个方法,dubboProvider的入参是model(dubboConsumer入参记得以boy开头哦)。
dubbo使用教程(可直接应用于企业开发)_第6张图片
        
        测试第2个接口的方法,dubboProvider的数据操作(dubboConsumer入参记得以select开头哦,select后拼接数据库中的id字段)。
Note:\dubbo\DubboProvider\test\com\zxiaofan\test\config\initDB.sql有建库建表的SQL,可直接使用。
dubbo使用教程(可直接应用于企业开发)_第7张图片

        最后放大招, 项目源码地址: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! 
将来的你一定会感激现在拼命的自己!

你可能感兴趣的:(dubbo,demo,教程,Tomcat,SpringJDBC,JavaEE,Spring,开源)