Dubbo+Zookeeper+Spring实战Dome

 

通过网上学习制作Dubbo+Zookeeper的过程,给自学的各位一个借鉴。本文主要通过三部分内容,分别介绍Dubbo、Zookeeper概念,最后通过Dubbo+Zookeeper+Spring实战Dome进行总结。

一、Dubbo

Dubbo的是一款优秀的分布式框架,下图介绍了Dubbo的运行流程

Dubbo服务环境dubbo-admin-2.5.3.war包,将war包放在tomcat下运行,可以通过系统对服务提供者和消费者进行管理。

二、Zookeeper

1,下载zookeeper注册中心,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/ 下载后解压即可,进入E:\zookeeper-3.3.6\zookeeper-3.3.6\bin,

双击zkServer.cmd启动注册中心服务。

zkServer.sh【Linux】或zkServer.cmd【Windows】

 

2,在你执行启动脚本之前,还有几个基本的配置项需要配置一下,Zookeeper的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper在启动时会找这个文件作为默认配置文件。下面详细介绍一下,这个配置文件中各个配置项的意义。

 

 

 

   •tickTime:这个时间是作为Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。

   •dataDir:顾名思义就是 Zookeeper保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

   •dataLogDir:顾名思义就是Zookeeper 保存日志文件的目录

   •clientPort:这个端口就是客户端连接Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求

 

配置好后,zookeeper会监听本机的2181端口。

当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。

三、Dubbo+Zookeeper+Spring实战Dome

3.1服务提供者

定义服务接口:(该接口需单独打包,在服务提供方和消费方共享)

package org.code.dubbo;

import java.util.*;

public interface HelloService {
    /**
     * say hello
     * @param name
     * @return
     */
    public String sayHello(String name);

    public List getUsers();
}

在服务提供方实现接口:(对服务消费方隐藏实现)

package org.code.dubbo;

import java.util.ArrayList;
import java.util.List;

public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return "hello,"+name+"!";
    }

    @Override
    public List getUsers() {
        List list = new ArrayList();
        User u1 = new User();
        u1.setName("hejingyuan");
        u1.setAge(20);
        u1.setSex("f");

        User u2 = new User();
        u2.setName("xvshu");
        u2.setAge(21);
        u2.setSex("m");


        list.add(u1);
        list.add(u2);

        return list;
    }
}

用户实体类(如果消费者需要获取用户对象需要先将实体类实例化,继承Serializable类)

package org.code.dubbo;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }


    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

}

用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: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
        ">

	<!-- 具体的实现bean -->
	<bean id="helloService" class="org.code.dubbo.HelloServiceImpl" />

	<!-- 提供方应用信息,用于计算依赖关系 -->
	<dubbo:application name="cs_provider" />

	<!-- 使用multicast广播注册中心暴露服务地址 -->
	<!--<dubbo:registry address="multicast://224.5.6.7:1234" /> -->

	<!-- 使用zookeeper注册中心暴露服务地址即zookeeper的所在服务器ip地址和端口号 -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />

	<!-- 用dubbo协议在20880端口暴露服务 -->
	<dubbo:protocol name="dubbo" port="20880" />

	<!-- 声明需要暴露的服务接口 -->
	<dubbo:service interface="org.code.dubbo.HelloService" ref="helloService" />

</beans>

加载Spring配置,启动服务(或者将项目建为web项目,然后在web.xml中配置好spring的启动,然后扔到tomcat中即可提供服务):

package org.code.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;


public class DomeProvider {
    public static void main(String[] args) throws Exception {
        //读取配置文件
        System.out.println("进入main方法");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-provider.xml"});
        context.start();
        System.out.println("provider服务已注册");
        //使线程阻塞
        // 为保证服务一直开着,利用输入流的阻塞来模拟
        System.in.read();
    }
}

3.1服务消费者

通过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: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="cs_consumer" />

	<!-- 使用zookeeper注册中心暴露服务地址 -->
	<!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
	<dubbo:registry address="zookeeper://127.0.0.1:2181" />

	<!-- 生成远程服务代理,可以像使用本地bean一样使用demoService -->
	<dubbo:reference id="helloService" interface="org.code.dubbo.HelloService" />


</beans>

调用服务测试:

package org.code.dubbo;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.List;

public class DomeConsumer {
    public static void main(String[] args) throws Exception {
        System.out.println("进入main方法");

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"dubbo-consumer.xml"});
        context.start();
        System.out.println("加载xml文件成功");

        HelloService helloService = (HelloService)context.getBean("helloService");
        System.out.println("获取服务成功");

        String hello = helloService.sayHello("hello dubbo");
        System.out.println(hello);

        List users = helloService.getUsers();
        if(users != null && users.size() > 0){
            for(int i = 0;i < users.size();i++){
                User user = (User)users.get(i);
                System.out.println(user.getName());
            }
        }
        System.in.read();
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值