欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

zookeeper+Springboot實現(xiàn)服務器動態(tài)上下線監(jiān)聽教程詳解

 更新時間:2022年06月24日 09:34:20   作者:啊陳曉  
這篇文章主要介紹了zookeeper+Springboot實現(xiàn)服務器動態(tài)上下線監(jiān)聽,主要介紹了什么是服務器動態(tài)上下線監(jiān)聽及為什么要實現(xiàn)對服務器上下線的監(jiān)聽,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

zookeeper+Springboot實現(xiàn)服務器動態(tài)上下線監(jiān)聽教程

一.什么是服務器動態(tài)上下線監(jiān)聽

客戶端能夠?qū)崟r洞察到服務器上下線的變化,現(xiàn)在我們看看下面三個變化給集群、服務器、客戶端三者的變化

初始情況

服務器3啟動

服務器2下線

從上面的圖我們可以知道,在集群中,每當一臺服務器上線時,都會在集群中注冊一個有序且臨時的節(jié)點,并通知客戶端;在服務器下線的時候,服務器所注冊的節(jié)點也會被刪除,并通知客戶端。在這樣的結(jié)構(gòu)下,客戶端便能夠通過集群實時監(jiān)聽服務器的上下線。

二.為什么要實現(xiàn)對服務器上下線的監(jiān)聽

在開發(fā)中,這種結(jié)構(gòu)應用的非常廣泛,核心用處如下:

  • 用于監(jiān)聽節(jié)點數(shù)據(jù)產(chǎn)生的變化,在zk中可以配置集群的通用配置,當配置數(shù)據(jù)發(fā)生了變化之后通知所有訂閱該節(jié)點的Watcher,該節(jié)點發(fā)生事件類型
  • 用于監(jiān)聽節(jié)點狀態(tài)的變化,比如創(chuàng)建一個節(jié)點、刪除一個節(jié)點等對節(jié)點的操作
  • 管理客戶端與服務端連接的生命周期

三.編碼實現(xiàn)

建議大家在實現(xiàn)之前可以先對zookeeper的一些API操作有一些了解,這些我在我的另外一篇文章做了詳細的介紹,有需要的小伙伴可以移步去看看喔。

基于Springboot整合zookeeper實現(xiàn)對節(jié)點的創(chuàng)建、監(jiān)聽與判斷

http://www.dbjr.com.cn/article/252816.htm

1.在集1.在zookeeper集群中創(chuàng)建一個servers節(jié)點

 create /servers "servers"

2.創(chuàng)建一個簡單的springboot工程并引入zookeeper

 <!--引入對應的zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.1</version>
        </dependency>

3.編寫DistributeServer(分布式服務端)

package com.canrioyuan.zookeepertest.zkcase1;
 
import org.apache.zookeeper.*;
 
import java.io.IOException;
 
//分布式服務器端
public class DistributeServer {
 
    //對應的zookeeper客戶端連接,連接之間不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超時時間,我們設置成2s
    private int sessionTimeout = 2000;
    //聲明zookeeper服務器端
    private ZooKeeper zkServer;
 
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //1.獲取zookeeper連接
        DistributeServer distributeServer = new DistributeServer();
        distributeServer.getConnect();
 
        //2.注冊服務器
        distributeServer.register(args[0]);
 
 
        //3.啟動
        distributeServer.business(args[0]);
    }
 
    private void business(String url) throws InterruptedException {
        System.out.println("url為" + url + "的服務器正在工作中");
        Thread.sleep(Long.MAX_VALUE);
    }
 
    private void register(String url) throws InterruptedException, KeeperException {
        //創(chuàng)建一個節(jié)點
        zkServer.create("/servers/" + url, url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
 
        System.out.println("url為" + url + "的服務器已經(jīng)上線");
    }
 
 
    //創(chuàng)建到zookeeper的客戶端連接
    private void getConnect() throws IOException {
        zkServer = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
 
            }
        });
    }
}

4.分布式客戶端

package com.canrioyuan.zookeepertest.zkcase1;
 
import org.apache.zookeeper.*;
 
import java.io.IOException;
 
import java.util.List;
 
//分布式客戶端
public class DistributeClient {
    //對應的zookeeper客戶端連接,連接之間不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超時時間,我們設置成2s
    private int sessionTimeout = 2000;
    //聲明zookeeper客戶端
    private static ZooKeeper zkClient;
    private final String PARENT_NODE = "/servers";
 
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //1.獲取zookeeper連接
        DistributeClient distributeClient = new DistributeClient();
        distributeClient.getConnect();
 
        //2.獲取servers中的子節(jié)點信息
        distributeClient.getServerList();
 
        //3.業(yè)務邏輯
        distributeClient.business();
    }
 
    private void business() throws InterruptedException {
        System.out.println("客戶端正在工作中......");
        Thread.sleep(Long.MAX_VALUE);
    }
 
    private void getServerList() throws InterruptedException, KeeperException {
        List<String> children = zkClient.getChildren(PARENT_NODE, true);
 
        for (String child : children) {
            System.out.println(child);
        }
    }
 
    private void getConnect() throws IOException {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                try {
 
                    getServerList();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (KeeperException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

四.測試

1.啟動客戶端,開啟監(jiān)聽

2.按照下面的流程啟動服務器端

輸入對應的服務器名,如我輸入的就是:server1

啟動成功后結(jié)果如下所示:

關注客戶端的監(jiān)聽狀況,發(fā)現(xiàn)已經(jīng)監(jiān)聽到集群中已經(jīng)出現(xiàn)了一個節(jié)點

為了使輸出更明顯,我們在zookeeper中的servers節(jié)點下創(chuàng)建一個server2的持久節(jié)點

此時客戶端也監(jiān)聽到了集群中節(jié)點的變化

4.此時我們關閉服務器端,再來觀察一下客戶端的監(jiān)聽情況

此時我們發(fā)現(xiàn)客戶端中只輸出了server2這個節(jié)點

至此,我們便成功實現(xiàn)了簡單的zookeeper集群對服務器端上下線的監(jiān)聽。

至此,我們zookeeper+Springboot實現(xiàn)服務器動態(tài)上下線監(jiān)聽教程就結(jié)束啦~

到此這篇關于zookeeper+Springboot實現(xiàn)服務器動態(tài)上下線監(jiān)聽的文章就介紹到這了,更多相關zookeeper動態(tài)上下線監(jiān)聽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java中帶參數(shù)的try(){}語法含義詳解

    java中帶參數(shù)的try(){}語法含義詳解

    這篇文章主要介紹了java中帶參數(shù)的try(){}語法含義詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java如何在沙箱環(huán)境中測試支付寶支付接口

    Java如何在沙箱環(huán)境中測試支付寶支付接口

    這篇文章主要介紹了Java如何在沙箱環(huán)境中測試支付寶支付接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • jar包中替換指定的class文件方法詳解

    jar包中替換指定的class文件方法詳解

    這篇文章主要為大家介紹了jar包中替換指定的class文件方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java中FileOutputStream類的使用

    Java中FileOutputStream類的使用

    java.io.FileOutputStream類是文件輸出流,用于將數(shù)據(jù)寫出到文件,下面就來介紹一下Java中FileOutputStream類的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • SpringBoot異步調(diào)用方法實現(xiàn)場景代碼實例

    SpringBoot異步調(diào)用方法實現(xiàn)場景代碼實例

    這篇文章主要介紹了SpringBoot異步調(diào)用方法實現(xiàn)場景代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Spring Boot Mysql 數(shù)據(jù)庫操作示例

    Spring Boot Mysql 數(shù)據(jù)庫操作示例

    本篇文章主要介紹了Spring Boot Mysql 數(shù)據(jù)庫操作示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • 淺談Java鎖機制

    淺談Java鎖機制

    在多線程環(huán)境下,程序往往會出現(xiàn)一些線程安全問題,為此,Java提供了一些線程的同步機制來解決安全問題,比如:synchronized鎖和Lock鎖都能解決線程安全問題。下面小編就來詳細介紹該知識點,需要的朋友可以參考一下
    2021-09-09
  • java通過url讀取文件內(nèi)容示例

    java通過url讀取文件內(nèi)容示例

    這篇文章主要介紹了java通過url讀取文件內(nèi)容示例,大家參考使用吧
    2014-01-01
  • Java實現(xiàn)SHA-1算法實例

    Java實現(xiàn)SHA-1算法實例

    這篇文章主要介紹了Java實現(xiàn)SHA-1算法,實例分析了java實現(xiàn)SHA-1算法的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • java實現(xiàn)圖片任意角度旋轉(zhuǎn)

    java實現(xiàn)圖片任意角度旋轉(zhuǎn)

    這篇文章主要為大家詳細介紹了java實現(xiàn)圖片任意角度旋轉(zhuǎn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04

最新評論