DUBBO+ZOOKEEPER 入门学习记录

采用spring3.2+dubbo2.5.3+zookeeper3.3.6java

所需架包如图所示   linux

1.安装zookeeper

        本文采用zookeeper-3.3.6,可自行查找下载。下载后进入conf目录下,修改zoo_sample.cfg为zoo.cfg。该文件为zookeeper的配置文件web

# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/tmp/zookeeper
# the port at which the clients will connect
clientPort=2181

tickTime:基本事件单元,以毫秒为单位。它用来控制心跳和超时,默认状况下最小的会话超时时间为两倍的 tickTime。spring

dataDir:存放内存数据的地方tomcat

clientPort:用户于zookeeper相连的端口bash

initLimit:Leader容许F在 initLimit 时间内完成这个工做,请求和响应时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 10*2000=20 秒服务器

syncLimit:检测机器的存活状态,请求和响应时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 5*2000=10 秒app

 

此处需注意这种文件框架

tickTime=2000
dataDir=/usr/zdatadir
dataLogDir=/usr/zlogdir
clientPort=2181
initLimit=5
syncLimit=2
server.1=cloud:2888:3888
server.2=cloud02:2888:3888
server.3=cloud03:2888:3888
server.4=cloud04:2888:3888
server.5=cloud05:2888:3888

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,须要一个端口来从新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通讯的端口。若是是伪集群的配置方式,因为 B 都是同样,因此不一样的 Zookeeper 实例通讯端口号不能同样,因此要给它们分配不一样的端口号webapp

除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断究竟是那个 server。

2.启动zookeeper

        此处我用的为第一个配置文件,并无配置集群。直接打开zookeeper-3.3.6\bin\zkServer.cmd,这里我是window环境,linux环境运行.sh文件

3.dubbo

        经过将服务统一管理起来,能够有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心能够经过特定协议来完成服务对外的统一。

        dubbo就是一个服务框架,能够实现调用远程接口像调用本地接口同样方便。

        这里注册中心咱们选择zookeeper

3.1安装Dubbo-admin,实现监控

 

        这里我安装的是dubbo-admin-2.5.3.war,部署到tomcat的webapps下,修改webapps\dubbo-admin-2.5.3\WEB-INF\dubbo.properties文件,内容以下

dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest

其中root和guest都为密码。

启动tomcat,效果以下(如提示输出帐号信息,输入root,root)

3.2dubbo流程

        provider注册----生产---->zookeeper<----消费--------consumer

        生产者将接口信息注册到zookeper,消费者经过zookeeper进行消费

3.3生产者注册

Provider.java文件以下

package com.dubbotest.provider;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class Provider {
 
    public static void main(String[] args) throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-service.xml");
        context.start();
        System.out.println("-----------");
        System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟,任意键退出
    }
}

applicationContext-service.xml以下

<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-3.2.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
        ">
 
    <bean id="user" class="com.model.User">
        <property name="name" value="person" />
    </bean>
 
    <!-- 具体的实现bean -->
    <bean id="demoService" class="com.dubbotest.provider.DemoServiceImpl" />
 
    <!-- 提供方应用信息,用于计算依赖关系 -->
    <dubbo:application name="xixi_provider" />
 
    <!-- 使用multicast广播注册中心暴露服务地址 <dubbo:registry address="multicast://224.5.6.7:1234" 
        /> -->
 
    <!-- 使用zookeeper注册中心暴露服务地址 -->
    <dubbo:registry address="zookeeper://127.0.0.1:2181" />
 
    <!-- 用dubbo协议在20880端口暴露服务 -->
    <dubbo:protocol name="dubbo" port="20880" />
 
    <!-- 声明须要暴露的服务接口 -->
    <!-- <dubbo:service interface="com.dubbotest.provider.DemoService" ref="demoService" 
        /> -->
    <dubbo:service interface="com.dubbotest.provider.DemoService"
        ref="demoService" />
 
</beans>

运行了provider中的main函数后能够在dubbo-admin管理中看见接口信息。

 

3.4consumer消费

Consumer.java以下

package com.dubbotest.consumer;
 
import java.util.List;
 
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.dubbotest.provider.DemoService;
import com.model.User;
 
public class Consumer {
 
    public static void main(String[] args) throws Exception {  
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(  
                new String[] { "applicationContext-dubbo.xml" });  
        context.start();  
        DemoService demoService = (DemoService) context.getBean("demoService"); 
        String hello = demoService.sayHello("tom"); 
        System.out.println(hello); 
        List<User> list = demoService.getUsers();  
        if (list != null && list.size() > 0) {  
            for (int i = 0; i < list.size(); i++) {  
                System.out.println(list.get(i).toString());  
            }  
        }  
        System.in.read();  
    }  
}

applicationContext-dubbo.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="hehe_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="demoService"  
            interface="com.dubbotest.provider.DemoService" />  
       
</beans>

运行后结果如图

3.5其余文件:

DemoService.java

package com.dubbotest.provider;
 
import java.util.List;
 
public interface DemoService {
    String sayHello(String name);  
       
    public List getUsers();  
}

DemoServiceImpl.java

package com.dubbotest.provider;
 
import java.util.ArrayList;
import java.util.List;
 
import org.springframework.stereotype.Component;
 
import com.alibaba.dubbo.config.annotation.Service;
import com.model.User;
 
@Service(version="1.0")//此处Component是Spring bean注解,Service是dubbo的注解
public class DemoServiceImpl implements DemoService{
 
    @Override
    public String sayHello(String name) {
        // TODO Auto-generated method stub
         return "Hello " + name;  
    }
 
    @Override
    public List getUsers() {
          List list = new ArrayList();  
             User u1 = new User();  
             u1.setName("jack");  
             u1.setAge(20);  
             u1.setSex("男");  
                
             User u2 = new User();  
             u2.setName("tom");  
             u2.setAge(21);  
             u2.setSex("女");  
                
             User u3 = new User();  
             u3.setName("rose");  
             u3.setAge(19);  
             u3.setSex("女");  
                
             list.add(u1);  
             list.add(u2);  
             list.add(u3);  
             return list;  
    }
 
}

User.java

package com.model;
 
import java.io.Serializable;
 
public class User implements Serializable{
     
    private String name;
    private String sex;
    private int age;
 
    @Override
    public String toString() {
        return "User [name=" + name + ", sex=" + sex + ", age=" + age + "]";
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getSex() {
        return sex;
    }
 
    public void setSex(String sex) {
        this.sex = sex;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
}
相关文章
相关标签/搜索