最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

zookeeper+Springboot實(shí)現(xiàn)服務(wù)器動(dòng)態(tài)上下線監(jiān)聽(tīng)教程詳解

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

zookeeper+Springboot實(shí)現(xiàn)服務(wù)器動(dòng)態(tài)上下線監(jiān)聽(tīng)教程

一.什么是服務(wù)器動(dòng)態(tài)上下線監(jiān)聽(tīng)

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

初始情況

服務(wù)器3啟動(dòng)

服務(wù)器2下線

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

二.為什么要實(shí)現(xiàn)對(duì)服務(wù)器上下線的監(jiān)聽(tīng)

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

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

三.編碼實(shí)現(xiàn)

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

基于Springboot整合zookeeper實(shí)現(xiàn)對(duì)節(jié)點(diǎn)的創(chuàng)建、監(jiān)聽(tīng)與判斷

http://m.fzitv.net/article/252816.htm

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

 create /servers "servers"

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

 <!--引入對(duì)應(yīng)的zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.1</version>
        </dependency>

3.編寫(xiě)DistributeServer(分布式服務(wù)端)

package com.canrioyuan.zookeepertest.zkcase1;
 
import org.apache.zookeeper.*;
 
import java.io.IOException;
 
//分布式服務(wù)器端
public class DistributeServer {
 
    //對(duì)應(yīng)的zookeeper客戶端連接,連接之間不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超時(shí)時(shí)間,我們?cè)O(shè)置成2s
    private int sessionTimeout = 2000;
    //聲明zookeeper服務(wù)器端
    private ZooKeeper zkServer;
 
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        //1.獲取zookeeper連接
        DistributeServer distributeServer = new DistributeServer();
        distributeServer.getConnect();
 
        //2.注冊(cè)服務(wù)器
        distributeServer.register(args[0]);
 
 
        //3.啟動(dòng)
        distributeServer.business(args[0]);
    }
 
    private void business(String url) throws InterruptedException {
        System.out.println("url為" + url + "的服務(wù)器正在工作中");
        Thread.sleep(Long.MAX_VALUE);
    }
 
    private void register(String url) throws InterruptedException, KeeperException {
        //創(chuàng)建一個(gè)節(jié)點(diǎn)
        zkServer.create("/servers/" + url, url.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
 
        System.out.println("url為" + url + "的服務(wù)器已經(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 {
    //對(duì)應(yīng)的zookeeper客戶端連接,連接之間不能存在空格
    private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
    //超時(shí)時(shí)間,我們?cè)O(shè)置成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é)點(diǎn)信息
        distributeClient.getServerList();
 
        //3.業(yè)務(wù)邏輯
        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();
                }
            }
        });
    }
}

四.測(cè)試

1.啟動(dòng)客戶端,開(kāi)啟監(jiān)聽(tīng)

2.按照下面的流程啟動(dòng)服務(wù)器端

輸入對(duì)應(yīng)的服務(wù)器名,如我輸入的就是:server1

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

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

為了使輸出更明顯,我們?cè)趜ookeeper中的servers節(jié)點(diǎn)下創(chuàng)建一個(gè)server2的持久節(jié)點(diǎn)

此時(shí)客戶端也監(jiān)聽(tīng)到了集群中節(jié)點(diǎn)的變化

4.此時(shí)我們關(guān)閉服務(wù)器端,再來(lái)觀察一下客戶端的監(jiān)聽(tīng)情況

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

至此,我們便成功實(shí)現(xiàn)了簡(jiǎn)單的zookeeper集群對(duì)服務(wù)器端上下線的監(jiān)聽(tīng)。

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

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

相關(guān)文章

  • 深入解析Spring?AI框架如何在Java應(yīng)用中實(shí)現(xiàn)智能化交互的關(guān)鍵

    深入解析Spring?AI框架如何在Java應(yīng)用中實(shí)現(xiàn)智能化交互的關(guān)鍵

    本文詳細(xì)介紹了SpringAI框架在Java應(yīng)用中的應(yīng)用,包括實(shí)體類映射、函數(shù)回調(diào)等核心功能的實(shí)現(xiàn),通過(guò)源碼分析,幫助開(kāi)發(fā)者更好地理解和使用這些高級(jí)特性,提升業(yè)務(wù)效率,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java通過(guò)AES生成公鑰加密數(shù)據(jù)ECC加密公鑰

    java通過(guò)AES生成公鑰加密數(shù)據(jù)ECC加密公鑰

    這篇文章主要為大家介紹了java通過(guò)AES生成公鑰加密數(shù)據(jù)ECC加密公鑰實(shí)現(xiàn)案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Java中的函數(shù)式編程

    Java中的函數(shù)式編程

    這篇文章介紹Java中的函數(shù)式編程,函數(shù)式編程是一種編程范式,其中程序是通過(guò)應(yīng)用和組合函數(shù)來(lái)構(gòu)造的。它是一種聲明式編程范式,其中函數(shù)定義是表達(dá)式樹(shù),每個(gè)表達(dá)式樹(shù)返回一個(gè)值,而不是一系列改變程序狀態(tài)的命令語(yǔ)句,具體情況請(qǐng)看下文,希望對(duì)你有所幫助
    2021-10-10
  • java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)

    java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù)

    今天小編就為大家分享一篇java實(shí)現(xiàn)讀取txt文件并以在每行以空格取數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶推送消息)

    Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶推送消息)

    本篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之netty-socketio實(shí)現(xiàn)簡(jiǎn)單聊天室(給指定用戶推送消息),具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-03-03
  • java IO流之轉(zhuǎn)換流的具體使用

    java IO流之轉(zhuǎn)換流的具體使用

    轉(zhuǎn)換流可以將一個(gè)字節(jié)流包裝成字符流,或者將一個(gè)字符流包裝成字節(jié)流,本文主要介紹了java IO流之轉(zhuǎn)換流的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Mybatis持久層框架入門(mén)之CRUD實(shí)例代碼詳解

    Mybatis持久層框架入門(mén)之CRUD實(shí)例代碼詳解

    這篇文章主要介紹了Mybatis持久層框架入門(mén)之CRUD實(shí)例,需要的朋友可以參考下
    2022-05-05
  • SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問(wèn)題及解決

    SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問(wèn)題及解決

    這篇文章主要介紹了SpringBoot整合kafka遇到的版本不對(duì)應(yīng)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • java面試題之try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序詳解

    java面試題之try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序詳解

    這篇文章主要介紹了關(guān)于java中的一道面試題,這套題就是在try中含return語(yǔ)句時(shí)代碼的執(zhí)行順序,這個(gè)問(wèn)題看似簡(jiǎn)單,卻暗藏殺機(jī)??!文中通過(guò)一個(gè)個(gè)例子詳細(xì)介紹了其中玄機(jī),需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-04-04
  • SpringBoot中的@ConfigurationProperties注解解析

    SpringBoot中的@ConfigurationProperties注解解析

    這篇文章主要介紹了SpringBoot中的@ConfigurationProperties注解解析,Spring源碼中大量使用了ConfigurationProperties注解,通過(guò)與其他注解配合使用,能夠?qū)崿F(xiàn)Bean的按需配置,該注解可以放在類上,也可以放在方法上,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

桃园市| 长白| 黄龙县| 林芝县| 建昌县| 千阳县| 柳河县| 香河县| 图木舒克市| 涿州市| 蕲春县| 东宁县| 靖安县| 巫溪县| 五河县| 元谋县| 云和县| 石渠县| 松原市| 乌拉特后旗| 叙永县| 宁武县| 济源市| 南通市| 裕民县| 德化县| 岳池县| 靖江市| 蕉岭县| 八宿县| 云霄县| 许昌县| 碌曲县| 门源| 上饶县| 蒙自县| 东光县| 永平县| 蕉岭县| 保德县| 万载县|