Dubbo+Zookeeper demo實現

一、安裝zookeeper,集羣模式配置

自行百度,下載解壓

(由於機器有限,本文使用一臺機器不同端口來模擬實現集羣模式)

1、創建zookeepere文件夾

2、zookeeper文件夾下新建server1、server2、server3三個文件夾

3、複製解壓後的zookeeper文件夾到server1、server2、server3這三個文件夾下

4、再分別在這三個文件夾下創建data、dataLog兩個目錄

完成後如下圖

進入zookeeper-3.4.14/conf文件夾,重命名zoo-sample.cfg爲zoo.cfg,並修改配置如下:

# 心跳檢測時間間隔,單位ms
tickTime = 2000

#zookeeper集羣中包含多臺server,其中一臺爲leader,其餘爲follower,initLimit參數配置初始化連接時,follower和leader之間的最長心跳時間,設置爲5,則表示時間限制爲5倍tickTime
initLimit = 5

#syncLimit配置leader和follower之間發送消息、請求和應答的最大時間長度,設置爲2,則說明時間限制爲2倍tickTime
syncLimit = 2

dataDir=/Library/zookeeper/server1/data
dataLogDir=/Library/zookeeper/server1/dataLog

clientPort=2181
server.1 = 127.0.0.1:2222:2225
server.2 = 127.0.0.1:3333:3335
server.3 = 127.0.0.1:4444:4445

其中dataDir爲data文件夾所在的位置, dataLogDir爲dataLog文件夾所在的位置

server1裏的clientPort=2181, server2裏的clientPort=2182, server3裏的clientPort=2183

在data文件夾裏新增myid文件,文件內容爲serverID, 如server1的myid文件的內容爲1,server2的myid文件內容爲2,以此類推

終端進入zookeeper3.4.14/bin目錄下,執行./zkServer.sh start啓動zookeeper服務,執行./zkServer.sh status查看服務狀態,當狀態爲一個leader, 2個follower時,則啓動成功

二、Dubbo服務生產者

項目結構如下

dubbotestapi項目下創建User對象

public class User implements Serializable{
    private static final long serialVersionUID = 5264854701181085862L;

    private Long id;
    private String username;
    private String password;
    private Integer age;

    public static long getSerialVersionUID() {
        return serialVersionUID;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

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

創建userAPI接口

public interface UserAPI {
    public List<User> getUsers();
    String sayHello(String name);
}

將dubbotestapi打包生成jar引入dubbotestservice項目,並引入其他依賴的jar包

<dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.34.Final</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.6</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
        </dependency>

        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>zookeeper</artifactId>
                    <groupId>org.apache.zookeeper</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
            <exclusions>
                <exclusion>
                    <artifactId>zookeeper</artifactId>
                    <groupId>org.apache.zookeeper</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

配置dubbo-provider.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">

    <bean id="userService" class="com.qjj.service.UserAPIImpl"/>

    <dubbo:application name="dubbo-provider"/>
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:1281,127.0.0.1:2182,127.0.0.1:2183" client="zkclient"/>
    <dubbo:protocol name="dubbo" port="20880"/>
    <dubbo:service interface="com.qjj.api.UserAPI" ref="userService"/>

</beans>

添加userAPI接口的實現類userAPIImpl文件

public class UserAPIImpl implements UserAPI{

    public List<User> getUsers() {
        List<User> list = new ArrayList<User>();

        for (int i=0;i<10;i++){
            User user = new User();
            user.setUsername("username_" + i);
            user.setId(Long.valueOf(i+1));
            user.setAge(10 + i);
            user.setPassword("123456");

            list.add(user);
        }

        return list;
    }

    public String sayHello(String name) {
        return "11111";
    }

三、Dubbo服務消費者

引入依賴的jar包

<dependency>
      <groupId>com.qjj</groupId>
      <artifactId>dubbotest.api</artifactId>
      <version>1.0-SNAPSHOT</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-oxm</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-all</artifactId>
      <version>4.1.34.Final</version>
    </dependency>

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>dubbo</artifactId>
      <version>2.6.6</version>
      <exclusions>
        <exclusion>
          <artifactId>spring-context</artifactId>
          <groupId>org.springframework</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.14</version>
    </dependency>

    <dependency>
      <groupId>com.github.sgroschupf</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.1</version>
      <exclusions>
        <exclusion>
          <artifactId>log4j</artifactId>
          <groupId>log4j</groupId>
        </exclusion>
        <exclusion>
          <artifactId>zookeeper</artifactId>
          <groupId>org.apache.zookeeper</groupId>
        </exclusion>
      </exclusions>
    </dependency>

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>4.2.0</version>
      <exclusions>
        <exclusion>
          <artifactId>zookeeper</artifactId>
          <groupId>org.apache.zookeeper</groupId>
        </exclusion>
      </exclusions>
    </dependency>

創建dubbo-consumer.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="dubbo-consumer" />

    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <!-- <dubbo:registry address="multicast://224.5.6.7:1234" /> -->
    <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" client="zkclient"/>

    <!-- 生成遠程服務代理,可以像使用本地bean一樣使用demoService -->
    <dubbo:reference id="userService" interface="com.qjj.api.UserAPI" />

</beans>

創建測試類

public class consumer {
    public static void main(String[] args) throws IOException {

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                new String[] { "dubbo-consumer.xml" });
        context.start();

        UserAPI userAPI = context.getBean(UserAPI.class);
        String hello = userAPI.sayHello("qijiaojiao");
        System.out.println(hello);

        List list = userAPI.getUsers();
        if (list != null && list.size() > 0) {
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));
            }
        }

    }
}

運行測試類,執行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章