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;
    }
 
}
相關文章
相關標籤/搜索