DUBBO是阿里巴巴开源的RPC框架,按照官网的说明可以很轻松的与spring搭建一个分布式服务。

DUBBO的官网:http://dubbo.io/

我使用的dubbo版本是dubbo-2.5.6,zookeeper版本是zookeeper3.4.11,spring版本是spring-4.3.13

dubbo-admin-2.5.8.war,是我在官网下载的,丢进tomcat就能跑起来,下载链接在最下面

其他依赖的jar包:

javassist-3.22.0-GA.jar  netty-3.9.9.Final.jar  slf4j-api-1.7.9.jar  slf4j-simple-1.7.9.jar  zkclient-0.10.jar

 

截个图:

jar包版本搞定之后,spring的配置文件和代码其实是很简单的。

服务端demo源码:https://gitee.com/zhuhongliang/dubboSpringStudy
客户端demo源码:https://gitee.com/zhuhongliang/dubboStudy

dubbo-admin后台管理可以对分布式服务做各种配置,集群的负载均衡权重等等,很丰富。

dubbo-admin-2.5.8.war,文件在dubboStudy项目的根目录下载

先做一个服务端的:

一个接口,一个接口实现类,一个spring配置xml就搞定。
接口:

package com.zhl.service;

/** 
* @author 朱宏亮
* @version 创建时间:2018年1月10日 上午10:42:26 
* 类说明 
*/

public interface ProviderService {
    
    public String hello(String name);
    
    public String say(String name);
    
}

实现接口:

package com.zhl.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/** 
* @author 朱宏亮
* @version 创建时间:2018年1月10日 上午11:04:16 
* 类说明 
*/
@Service("providerService")
public class ProviderServiceImpl implements ProviderService{
    Logger logger = LoggerFactory.getLogger(ProviderServiceImpl.class);
    @Override
    public String hello(String name) {
        logger.info("方法hell");
        return "服务器8081welcome :"+name+" !" ;  
    }
    @Override
    public String say(String name) {
        logger.info("方法say");
        return "服务器8081你好 : "+name+" !" ;
    }
}
 

spring的配置文件:

<?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://code.alibabatech.com/schema/dubbo 
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    <context:component-scan base-package="com.zhl.service" />
       
    <!-- 提供方应用信息,用于计算依赖关系 -->  
    <dubbo:application name="zhl_provider"  />  
    
    <!-- 使用zookeeper注册中心暴露服务地址
	    dubbo:registry 标签一些属性的说明:
	      1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
	      2)check注册中心不存在时,是否报错。
	      3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
	      4)timeout注册中心请求超时时间(毫秒)。
	      5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
     -->  
    <dubbo:registry address="zookeeper://192.168.1.129:2181" subscribe="false" register=""/>   
    
    <!-- 用dubbo协议在20880端口暴露服务 sticky粘滞连接-->  
    <dubbo:protocol name="dubbo" port="20880" sticky="true" />  

    <!-- 声明需要暴露的服务接口
	    dubbo:service标签的一些属性说明:
	     1)interface服务接口的路径
	     2)ref引用对应的实现类的Bean的ID
	     3)registry向指定注册中心注册,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔,如果不想将该服务注册到任何registry,可将值设为N/A
	     4)register 默认true ,该协议的服务是否注册到注册中心。
     -->  
    <dubbo:service interface="com.zhl.service.ProviderService" ref="providerService" cluster="failover"/> 
     
    <!-- 具体的实现bean -->  
    <!-- 使用spring的@Service注解 
        <bean id="providerService" class="com.zhl.service.ProviderServiceImpl" />  
     -->
    <!-- 声明需要暴露的服务接口 -->  
    <dubbo:service interface="com.zhl.service.UserService" ref="userService" />  
  
</beans>

需要提供多少个服务,就向zookeeper暴露多少个服务接口(dubbo:service)就行了

其他基本的springmvc的文件我就不贴出来了,不会的话下源码看。文章的最后有源码链接。

就这样打包丢进tomcat就能跑起来了。

 

消费端:在客户端需要一个和服务端一模一样的接口文件,不需要具体实现类文件。客户端向zookeeper获取服务端暴露的服务地址,然后和服务端连接,访问服务接口和具体方法。
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: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://code.alibabatech.com/schema/dubbo 
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
       
    <dubbo:application name="zhl-consumer"/>
    
    <!-- 使用zookeeper注册中心暴露服务地址
        dubbo:registry 标签一些属性的说明:
          1)register是否向此注册中心注册服务,如果设为false,将只订阅,不注册。
          2)check注册中心不存在时,是否报错。
          3)subscribe是否向此注册中心订阅服务,如果设为false,将只注册,不订阅。
          4)timeout注册中心请求超时时间(毫秒)。
          5)address可以Zookeeper集群配置,地址可以多个以逗号隔开等。
     -->  
    <dubbo:registry address="zookeeper://192.168.1.129:2181" register="false" />  
     
    <!--
     1)interface调用的服务接口
     2)check 启动时检查提供者是否存在,true报错,false忽略
     3)registry 从指定注册中心注册获取服务列表,在多个注册中心时使用,值为<dubbo:registry>的id属性,多个注册中心ID用逗号分隔
     4)loadbalance 负载均衡策略,可选值:random,roundrobin,leastactive,分别表示:随机,轮循,最少活跃调用
    -->
    <dubbo:reference id="providerService" interface="com.zhl.service.ProviderService"  />
    <dubbo:reference id="demoService" interface="com.zhl.service.DemoService"   />
    <dubbo:reference id="userService" interface="com.zhl.service.UserService"  />
    
</beans>

客户端代码:

package com.zhl.consumer;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zhl.service.DemoService;
import com.zhl.service.ProviderService;
import com.zhl.service.User;
import com.zhl.service.UserService;

/** 
* @author 朱宏亮
* @version 创建时间:2018年1月9日 上午10:10:33 
* 类说明 
*/
public class Consumer {

    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"conf/consumer.xml"});
        //for(int i =0;i <10;i++){
        context.start();
       /* // obtain proxy object for remote invocation
        DemoService demoService = (DemoService) context.getBean("demoService");
        // execute remote invocation
        String hello = demoService.sayHello("world");
        // show the result
        System.out.println(hello);
        */
        UserService userService = (UserService) context.getBean("userService");
        User user = userService.getUser();
        System.out.println("id:"+user.getId()+"\t name:"+user.getName()+"\t phone:"+user.getPhone()+"\t address:"+user.getAddress());
        user.setId(88);
        user.setName("朱宏亮");
        user.setPhone("18627888889");
        user.setAddress("中关村软件园");
        userService.setUser(user);
        User user2 = userService.getUser();
        System.out.println("user2 id:"+user2.getId()+"\t user2 name:"+user2.getName()+"\t user2 phone:"+user2.getPhone()+"\t user2 address:"+user2.getAddress());

        ProviderService providerService = (ProviderService)context.getBean("providerService");
        String msg = providerService.hello("zhl");
        System.out.println(msg);
        String msg2 = providerService.say("朱宏亮");
        System.out.println(msg2);
        
        
        //}
        //context.close();
        //System.exit(0);
    }

}

其实这个东西的基本功能的使用就是这么简单,而且官方文档也特别详细,最关键的还是中文文档。

服务端demo源码:https://gitee.com/zhuhongliang/dubboSpringStudy
客户端demo源码:https://gitee.com/zhuhongliang/dubboStudy

dubbo-admin后台管理可以对分布式服务做各种配置,集群的负载均衡权重等等,很丰富。

dubbo-admin-2.5.8.war,文件在dubboStudy项目的根目录下载

下面是:管理后台dubbo-admin的截图:

 

 

发表评论