1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        一文徹底搞懂 zookeeper 核心知識(shí)點(diǎn)(修訂版)

        共 15635字,需瀏覽 32分鐘

         ·

        2020-12-17 12:49


        點(diǎn)擊“ 程序員內(nèi)點(diǎn)事 ”關(guān)注,選擇“ 設(shè)置星標(biāo) ”

        堅(jiān)持學(xué)習(xí),好文每日送達(dá)!




        初識(shí) zookeeper

        Zookeeper 它作為Hadoop項(xiàng)目中的一個(gè)開(kāi)源子項(xiàng)目,是一個(gè)經(jīng)典的分布式數(shù)據(jù)一致性解決方案,致力于為分布式應(yīng)用提供一個(gè)高性能、高可用,且具有嚴(yán)格順序訪問(wèn)控制能力的分布式協(xié)調(diào)服務(wù)。

        1、zookeeper數(shù)據(jù)模型

        zookeeper 維護(hù)了一個(gè)類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu),每個(gè)子目錄(/微信、/微信/公眾號(hào))都被稱作為 znode 即節(jié)點(diǎn)。和文件系統(tǒng)一樣,我們可以很輕松的對(duì) znode 節(jié)點(diǎn)進(jìn)行增加、刪除等操作,而且還可以在一個(gè)znode下增加、刪除子znode,區(qū)別在于文件系統(tǒng)的是,znode可以存儲(chǔ)數(shù)據(jù)(嚴(yán)格說(shuō)是必須存放數(shù)據(jù),默認(rèn)是個(gè)空字符)。

        由于zookeeper是目錄節(jié)點(diǎn)結(jié)構(gòu),在獲取和創(chuàng)建節(jié)點(diǎn)時(shí),必須要以“/” 開(kāi)頭,否則在獲取節(jié)點(diǎn)時(shí)會(huì)報(bào)錯(cuò) Path must start with / character

        [zk: localhost:2181(CONNECTED) 13get test
        Command failed: java.lang.IllegalArgumentException: Path must start with / character

        根節(jié)點(diǎn)名必須為“/XXX”,創(chuàng)建子節(jié)點(diǎn)時(shí)必須要帶上根節(jié)點(diǎn)目錄“/XXX/CCC”“/XXX/AAA”。

        例如:想要獲取下圖 程序員內(nèi)點(diǎn)事 節(jié)點(diǎn)必須拼接完整的路徑 get /微信/公眾號(hào)/程序員內(nèi)點(diǎn)事

        get /微信/公眾號(hào)/程序員內(nèi)點(diǎn)事
        在這里插入圖片描述

        znode被用來(lái)存儲(chǔ) byte級(jí)kb級(jí) 的數(shù)據(jù),可存儲(chǔ)的最大數(shù)據(jù)量是1MB請(qǐng)注意:一個(gè)節(jié)點(diǎn)的數(shù)據(jù)量不僅包含它自身存儲(chǔ)數(shù)據(jù),它的所有子節(jié)點(diǎn)的名字也要折算成Byte數(shù)計(jì)入,因此znode的子節(jié)點(diǎn)數(shù)也不是無(wú)限的)雖然可以手動(dòng)的修改節(jié)點(diǎn)存儲(chǔ)量大小,但一般情況下并不推薦這樣做。


        2、znode節(jié)點(diǎn)屬性

        一個(gè)znode節(jié)點(diǎn)不僅可以存儲(chǔ)數(shù)據(jù),還有一些其他特別的屬性。接下來(lái)我們創(chuàng)建一個(gè)/test節(jié)點(diǎn)分析一下它各個(gè)屬性的含義。

        [zk: localhost:2181(CONNECTED) 6get /test
        456
        cZxid = 0x59ac //
        ctime = Mon Mar 30 15:20:08 CST 2020
        mZxid = 0x59ad
        mtime = Mon Mar 30 15:22:25 CST 2020
        pZxid = 0x59ac
        cversion = 0
        dataVersion = 2
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 3
        numChildren = 0  
        節(jié)點(diǎn)屬性 注解
        cZxid 該數(shù)據(jù)節(jié)點(diǎn)被創(chuàng)建時(shí)的事務(wù)Id
        mZxid 該數(shù)據(jù)節(jié)點(diǎn)被修改時(shí)最新的事物Id
        pZxid 當(dāng)前節(jié)點(diǎn)的父級(jí)節(jié)點(diǎn)事務(wù)Id
        ctime 該數(shù)據(jù)節(jié)點(diǎn)創(chuàng)建時(shí)間
        mtime 該數(shù)據(jù)節(jié)點(diǎn)最后修改時(shí)間
        dataVersion 當(dāng)前節(jié)點(diǎn)版本號(hào)(每修改一次值+1遞增)
        cversion 子節(jié)點(diǎn)版本號(hào)(子節(jié)點(diǎn)修改次數(shù),每修改一次值+1遞增)
        aclVersion 當(dāng)前節(jié)點(diǎn)acl版本號(hào)(節(jié)點(diǎn)被修改acl權(quán)限,每修改一次值+1遞增)
        ephemeralOwner 臨時(shí)節(jié)點(diǎn)標(biāo)示,當(dāng)前節(jié)點(diǎn)如果是臨時(shí)節(jié)點(diǎn),則存儲(chǔ)的創(chuàng)建者的會(huì)話id(sessionId),如果不是,那么值=0
        dataLength 當(dāng)前節(jié)點(diǎn)所存儲(chǔ)的數(shù)據(jù)長(zhǎng)度
        numChildren 當(dāng)前節(jié)點(diǎn)下子節(jié)點(diǎn)的個(gè)數(shù)

        我們看到一個(gè)znode節(jié)點(diǎn)的屬性比較多,但比較主要的屬性還是zxid、versionacl 這三個(gè)。


        Zxid:

        znode節(jié)點(diǎn)狀態(tài)改變會(huì)導(dǎo)致該節(jié)點(diǎn)收到一個(gè)zxid格式的時(shí)間戳,這個(gè)時(shí)間戳是全局有序的,znode節(jié)點(diǎn)的建立或者更新都會(huì)產(chǎn)生一個(gè)新的。如果zxid1的值 < zxid2的值,那么說(shuō)明zxid2發(fā)生的改變?cè)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(30, 107, 184);background-color: rgba(27, 31, 35, 0.05);font-family: " operator mono, consolas, monaco, menlo, monospace;word-break: break-all;>zxid1之后。每個(gè)znode節(jié)點(diǎn)都有3個(gè)zxid屬性,cZxid(節(jié)點(diǎn)創(chuàng)建時(shí)間)、mZxid(該節(jié)點(diǎn)修改時(shí)間,與子節(jié)點(diǎn)無(wú)關(guān))、pZxid(該節(jié)點(diǎn)或者該節(jié)點(diǎn)的子節(jié)點(diǎn)的最后一次創(chuàng)建或者修改時(shí)間,孫子節(jié)點(diǎn)無(wú)關(guān))。

        zxid屬性主要應(yīng)用于zookeeper的集群,這個(gè)后邊介紹集群時(shí)詳細(xì)說(shuō)。

        Version:

        znode屬性中一共有三個(gè)版本號(hào)dataversion(數(shù)據(jù)版本號(hào))、cversion(子節(jié)點(diǎn)版本號(hào))、aclversion(節(jié)點(diǎn)所擁有的ACL權(quán)限版本號(hào))。

        znode中的數(shù)據(jù)可以有多個(gè)版本,如果某一個(gè)節(jié)點(diǎn)下存有多個(gè)數(shù)據(jù)版本,那么查詢這個(gè)節(jié)點(diǎn)數(shù)據(jù)就需要帶上版本號(hào)。每當(dāng)我們對(duì)znode節(jié)點(diǎn)數(shù)據(jù)修改后,該節(jié)點(diǎn)的dataversion版本號(hào)會(huì)遞增。當(dāng)客戶端請(qǐng)求該znode節(jié)點(diǎn)時(shí),會(huì)同時(shí)返回節(jié)點(diǎn)數(shù)據(jù)和版本號(hào)。另外當(dāng)dataversion-1的時(shí)候可以忽略版本進(jìn)行操作。對(duì)一個(gè)節(jié)點(diǎn)設(shè)置權(quán)限時(shí)aclVersion版本號(hào)會(huì)遞增,下邊會(huì)詳細(xì)說(shuō)ACL權(quán)限控制。

        驗(yàn)證一下,我們修改/test節(jié)點(diǎn)的數(shù)據(jù)看看dataVersion有什么變化,發(fā)現(xiàn)dataVersion屬性變成了 3,版本號(hào)遞增了。

        [zk: localhost:2181(CONNECTED) 10set /test 8888
        cZxid = 0x59ac
        ctime = Mon Mar 30 15:20:08 CST 2020
        mZxid = 0x59b6
        mtime = Mon Mar 30 16:58:08 CST 2020
        pZxid = 0x59ac
        cversion = 0
        dataVersion = 3
        aclVersion = 0
        ephemeralOwner = 0x0
        dataLength = 4
        numChildren = 0


        3、znode的類型

        zookeeper 有四種類型的znode,在用客戶端 client 創(chuàng)建節(jié)點(diǎn)的時(shí)候需要指定類型。

        zookeeper.create("/公眾號(hào)/程序員內(nèi)點(diǎn)事""".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        • PERSISTENT-持久化目錄節(jié)點(diǎn) :client創(chuàng)建節(jié)點(diǎn)后,與zookeeper斷開(kāi)連接該節(jié)點(diǎn)將被持久化,當(dāng)client再次連接后節(jié)點(diǎn)依舊存在。

        • PERSISTENT_SEQUENTIAL-持久化順序節(jié)點(diǎn) :client創(chuàng)建節(jié)點(diǎn)后,與zookeeper斷開(kāi)連接該節(jié)點(diǎn)將被持久化,再次連接節(jié)點(diǎn)還存在,zookeeper會(huì)給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào),例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。

        • EPHEMERAL-臨時(shí)目錄節(jié)點(diǎn) :client與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)即會(huì)被刪除

        • EPHEMERAL_SEQUENTIAL-臨時(shí)順序節(jié)點(diǎn) :client與zookeeper斷開(kāi)連接后,該節(jié)點(diǎn)被刪除,會(huì)給該節(jié)點(diǎn)名稱進(jìn)行順序編號(hào),例如:/lock/0000000001、/lock/0000000002、/lock/0000000003。



        節(jié)點(diǎn)的ACL權(quán)限控制

        ACL:即 Access Control List (節(jié)點(diǎn)的權(quán)限控制),通過(guò)ACL機(jī)制來(lái)解決znode節(jié)點(diǎn)的訪問(wèn)權(quán)限問(wèn)題,要注意的是zookeeper對(duì)權(quán)限的控制是基于znode級(jí)別的,也就說(shuō)節(jié)點(diǎn)之間的權(quán)限不具有繼承性,即子節(jié)點(diǎn)不繼承父節(jié)點(diǎn)的權(quán)限。

        zookeeper中設(shè)置ACL權(quán)限的格式由 : : 三段組成。

        schema :表示授權(quán)的方式

        • world:表示任何人都可以訪問(wèn)
        • auth:只有認(rèn)證的用戶可以訪問(wèn)
        • digest:使用username  :password用戶密碼生成MD5哈希值作為認(rèn)證ID
        • host/ip:使用客戶端主機(jī)IP地址來(lái)進(jìn)行認(rèn)證

        id:權(quán)限的作用域,用來(lái)標(biāo)識(shí)身份,依賴于schema選擇哪種方式。

        acl:給一個(gè)節(jié)點(diǎn)賦予哪些權(quán)限,節(jié)點(diǎn)的權(quán)限有create,、delete、write、read、admin 統(tǒng)稱 cdwra。

        1、world:表示任何人都可以訪問(wèn)

        我們用 getAcl 命令來(lái)看一下,沒(méi)有設(shè)置過(guò)權(quán)限的znode節(jié)點(diǎn),默認(rèn)情況下的權(quán)限情況。

        [zk: localhost:2181(CONNECTED) 12] getAcl /test
        'world,'anyone
        : cdrwa

        看到?jīng)]有設(shè)置ACL屬性的節(jié)點(diǎn),默認(rèn)schema 使用的是world,作用域是anyone,節(jié)點(diǎn)權(quán)限是cdwra,也就是說(shuō)任何人都可以訪問(wèn)。

        那我們?nèi)绻o一個(gè)schema 為非world的節(jié)點(diǎn)設(shè)置world權(quán)限咋搞?

        setAcl /test world:anyone:crdwa

        2、auth:只有認(rèn)證的用戶可以訪問(wèn)

        schema 用auth授權(quán)表示只有認(rèn)證后的用戶才可以訪問(wèn),那么首先就需要添加認(rèn)證用戶,添加完以后需要對(duì)認(rèn)證的用戶設(shè)置ACL權(quán)限。

        addauth digest test:password(明文)

        需要注意的是設(shè)置認(rèn)證用戶時(shí)的密碼是明文的。

        [zk: localhost:2181(CONNECTED) 2] addauth digest user:user //用戶名:密碼
        [zk: localhost:2181(CONNECTED) 5] setAcl /test auth:user:crdwa
        [zk: localhost:2181(CONNECTED) 6] getAcl /test
        'digest,'user:ben+k/3JomjGj4mfd4fYsfM6p0A=
        : cdrwa

        實(shí)際上我們這樣設(shè)置以后,就是將這個(gè)節(jié)點(diǎn)開(kāi)放給所有認(rèn)證的用戶,setAcl /test auth:user:crdwa 相當(dāng)于setAcl /test auth::crdwa。

        3、digest:用戶名:密碼的驗(yàn)證方式

        用戶名:密碼方式授權(quán)是針對(duì)單個(gè)特定用戶,這種方式是不需要先添加認(rèn)證用戶的。

        如果在代碼中使用zookeeper客戶端設(shè)置ACL,那么密碼是明文的,但若是zk.cli等客戶端操作就需要將密碼進(jìn)行sha1base64處理。

        setAcl 
                         
                           digest:
                          
                           :
                           
                            :
                            
                             

        setAcl /test digest:user:jalRr+knv/6L2uXdenC93dEDNuE=:crdwa

        那么密碼如何加密嘞?有以下幾種方式:

        通過(guò)shell命令加密

        echo -n 
                         
                          :
                          <password> | openssl dgst -binary -sha1 | openssl base64

        使用zookeeper自帶的類庫(kù)org.apache.zookeeper.server.auth.DigestAuthenticationProvider生成

        java -cp /zookeeper-3.4.13/zookeeper-3.4.13.jar:/zookeeper-3.4.13/lib/slf4j-api-1.7.25.jar \
          org.apache.zookeeper.server.auth.DigestAuthenticationProvider \
          root:root
        root:root->root:qiTlqPLK7XM2ht3HMn02qRpkKIE=

        4、host/ip:使用客戶端主機(jī)IP地址來(lái)進(jìn)行認(rèn)證

        這種方式就比較好理解了,通過(guò)對(duì)特定的IP地址,也可以是一個(gè)IP段進(jìn)行授權(quán)。

        [zk: localhost:2181(CONNECTED) 3] setAcl /test0000000014 ip:127.0.0.1:crdwa
        cZxid = 0x59ac
        ctime = Mon Mar 30 15:20:08 CST 2020
        mZxid = 0x59b6
        mtime = Mon Mar 30 16:58:08 CST 2020
        pZxid = 0x59ac
        cversion = 0
        dataVersion = 3
        aclVersion = 3 // 這個(gè)版本一直在增加
        ephemeralOwner = 0x0
        dataLength = 4
        numChildren = 0




        zookeeper 靈魂 watcher

        我們?cè)陂_(kāi)頭就說(shuō)過(guò):zookeeper可以為dubbo提供服務(wù)的注冊(cè)與發(fā)現(xiàn),作為注冊(cè)中心,但你有想過(guò)zookeeper為啥能夠?qū)崿F(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)嗎?這就不得不說(shuō)一下zookeeper的靈魂 Watcher(監(jiān)聽(tīng)者)。

        1、watcher是個(gè)啥?

        watcherzooKeeper中一個(gè)非常核心功能 ,客戶端watcher 可以監(jiān)控節(jié)點(diǎn)的數(shù)據(jù)變化以及它子節(jié)點(diǎn)的變化,一旦這些狀態(tài)發(fā)生變化,zooKeeper服務(wù)端就會(huì)通知所有在這個(gè)節(jié)點(diǎn)上設(shè)置過(guò)watcher的客戶端 ,從而每個(gè)客戶端都很快感知,它所監(jiān)聽(tīng)的節(jié)點(diǎn)狀態(tài)發(fā)生變化,而做出對(duì)應(yīng)的邏輯處理。

        簡(jiǎn)單的介紹了一下watcher ,那么我們來(lái)分析一下,zookeeper是如何實(shí)現(xiàn)服務(wù)的注冊(cè)與發(fā)現(xiàn)。zookeeper的服務(wù)注冊(cè)與發(fā)現(xiàn),主要應(yīng)用的是zookeeperznode節(jié)點(diǎn)數(shù)據(jù)模型和watcher機(jī)制,大致的流程如下:

        在這里插入圖片描述
        • 服務(wù)注冊(cè): 服務(wù)提供者(Provider)啟動(dòng)時(shí),會(huì)向zookeeper服務(wù)端注冊(cè)服務(wù)信息,也就是創(chuàng)建一個(gè)節(jié)點(diǎn),例如:用戶注冊(cè)服務(wù)com.xxx.user.register,并在節(jié)點(diǎn)上存儲(chǔ)服務(wù)的相關(guān)數(shù)據(jù)(如服務(wù)提供者的ip地址、端口等)。

        • 服務(wù)發(fā)現(xiàn): 服務(wù)消費(fèi)者(Consumer)啟動(dòng)時(shí),根據(jù)自身配置的依賴服務(wù)信息,向zookeeper服務(wù)端獲取注冊(cè)的服務(wù)信息并設(shè)置watch監(jiān)聽(tīng),獲取到注冊(cè)的服務(wù)信息之后,將服務(wù)提供者的信息緩存在本地,并進(jìn)行服務(wù)的調(diào)用。

        • 服務(wù)通知: 一旦服務(wù)提供者因某種原因宕機(jī)不再提供服務(wù)之后,客戶端與zookeeper服務(wù)端斷開(kāi)連接,zookeeper服務(wù)端上服務(wù)提供者對(duì)應(yīng)服務(wù)節(jié)點(diǎn)會(huì)被刪除(例如:用戶注冊(cè)服務(wù)com.xxx.user.register),隨后zookeeper服務(wù)端會(huì)異步向所有消費(fèi)用戶注冊(cè)服務(wù)com.xxx.user.register,且設(shè)置了watch監(jiān)聽(tīng)的服務(wù)消費(fèi)者發(fā)出節(jié)點(diǎn)被刪除的通知,消費(fèi)者根據(jù)收到的通知拉取最新服務(wù)列表,更新本地緩存的服務(wù)列表。

        上邊的過(guò)程就是zookeeper可以實(shí)現(xiàn)服務(wù)注冊(cè)與發(fā)現(xiàn)的大致原理。

        2、watcher類型

        znode節(jié)點(diǎn)可以設(shè)置兩類watch,一種是DataWatches,基于znode節(jié)點(diǎn)的數(shù)據(jù)變更從而觸發(fā) watch 事件,觸發(fā)條件getData()、exists()、setData()、 create()。

        另一種是Child Watches,基于znode的孩子節(jié)點(diǎn)發(fā)生變更觸發(fā)的watch事件,觸發(fā)條件 getChildren()、 create()。

        而在調(diào)用 delete() 方法刪除znode時(shí),則會(huì)同時(shí)觸發(fā)Data WatchesChild Watches,如果被刪除的節(jié)點(diǎn)還有父節(jié)點(diǎn),則父節(jié)點(diǎn)會(huì)觸發(fā)一個(gè)Child Watches。

        3、watcher特性

        watch對(duì)節(jié)點(diǎn)的監(jiān)聽(tīng)事件是一次性的!客戶端在指定的節(jié)點(diǎn)設(shè)置了監(jiān)聽(tīng)watch,一旦該節(jié)點(diǎn)數(shù)據(jù)發(fā)生變更通知一次客戶端后,客戶端對(duì)該節(jié)點(diǎn)的監(jiān)聽(tīng)事件就失效了。

        如果還要繼續(xù)監(jiān)聽(tīng)這個(gè)節(jié)點(diǎn),就需要我們?cè)诳蛻舳说谋O(jiān)聽(tīng)回調(diào)中,再次對(duì)節(jié)點(diǎn)的監(jiān)聽(tīng)watch事件設(shè)置為True。否則客戶端只能接收到一次該節(jié)點(diǎn)的變更通知。



        zookeeper 實(shí)現(xiàn)的功能

        服務(wù)的注冊(cè)與發(fā)現(xiàn)功能只是zookeeper的冰山一角,它還能實(shí)現(xiàn)諸如分布式鎖、隊(duì)列、配置中心等一系列功能,接下來(lái)我們只分析一下原理,具體的實(shí)現(xiàn)大家上網(wǎng)查一下資料還是比較全的。

        1、分布式鎖

        zookeeper基于watcher機(jī)制和znode的有序節(jié)點(diǎn),天生就是一個(gè)分布式鎖的坯子。首先創(chuàng)建一個(gè)/test/lock父節(jié)點(diǎn)作為一把鎖,盡量是持久節(jié)點(diǎn)(PERSISTENT類型),每個(gè)嘗試獲取這把鎖的客戶端,在/test/lock父節(jié)點(diǎn)下創(chuàng)建臨時(shí)順序子節(jié)點(diǎn)。

        由于序號(hào)的遞增性,我們規(guī)定序號(hào)最小的節(jié)點(diǎn)即獲得鎖。例如:客戶端來(lái)獲取鎖,在/test/lock節(jié)點(diǎn)下創(chuàng)建節(jié)點(diǎn)為/test/lock/seq-00000001,它是最小的所以它優(yōu)先拿到了鎖,其它節(jié)點(diǎn)等待通知再次獲取鎖。/test/lock/seq-00000001執(zhí)行完自己的邏輯后刪除節(jié)點(diǎn)釋放鎖。

        那么節(jié)點(diǎn)/test/lock/seq-00000002想要獲取鎖等誰(shuí)的通知呢?

        這里我們讓/test/lock/seq-00000002節(jié)點(diǎn)監(jiān)聽(tīng)/test/lock/seq-00000001節(jié)點(diǎn),一旦/test/lock/seq-00000001節(jié)點(diǎn)刪除,則通知/test/lock/seq-00000002節(jié)點(diǎn),讓它再次判斷自己是不是最小的節(jié)點(diǎn),是則拿到鎖,不是繼續(xù)等通知。

        以此類推/test/lock/seq-00000003節(jié)點(diǎn)監(jiān)聽(tīng)/test/lock/seq-00000002節(jié)點(diǎn),總是讓后一個(gè)節(jié)點(diǎn)監(jiān)聽(tīng)前一個(gè)節(jié)點(diǎn),不用讓所有節(jié)點(diǎn)都監(jiān)聽(tīng)最小的節(jié)點(diǎn),避免設(shè)置不必要的監(jiān)聽(tīng),以免造成大量無(wú)效的通知,形成“羊群效應(yīng)”。

        zookeeper分布式鎖和redis分布式鎖相比,因?yàn)榇罅康膭?chuàng)建、刪除節(jié)點(diǎn)性能上比較差,并不是很推薦。

        2、分布式隊(duì)列

        zookeeper實(shí)現(xiàn)分布式隊(duì)列也很簡(jiǎn)單,應(yīng)用znode的有序節(jié)點(diǎn)天然的“先進(jìn)先出”,后創(chuàng)建的節(jié)點(diǎn)總是最大的,出隊(duì)總是拿序號(hào)最小的節(jié)點(diǎn)即可。

        3、配置管理

        現(xiàn)在有很多開(kāi)源項(xiàng)目都在使用Zookeeper來(lái)維護(hù)配置,像消息隊(duì)列Kafka中,就使用Zookeeper來(lái)維護(hù)broker的信息;dubbo中管理服務(wù)的配置信息。原理也是基于watcher機(jī)制,例如:創(chuàng)建一個(gè)/config節(jié)點(diǎn)存放一些配置,客戶端監(jiān)聽(tīng)這個(gè)節(jié)點(diǎn),一點(diǎn)修改/config節(jié)點(diǎn)的配置信息,通知各個(gè)客戶端數(shù)據(jù)變更重新拉取配置信息。

        4、命名服務(wù)

        zookeeper的命名服務(wù):也就是我們常說(shuō)的服務(wù)注冊(cè)與發(fā)現(xiàn),主要是根據(jù)指定名字來(lái)獲取資源或服務(wù)的地址,服務(wù)提供者等信息,利用其znode節(jié)點(diǎn)的特點(diǎn)和watcher機(jī)制,將其作為動(dòng)態(tài)注冊(cè)和獲取服務(wù)信息的配置中心,統(tǒng)一管理服務(wù)名稱和其對(duì)應(yīng)的服務(wù)器列表信息,我們能夠近乎實(shí)時(shí)地感知到后端服務(wù)器的狀態(tài)(上線、下線、宕機(jī))。




        嘮嘮嗑

        如果有一絲收獲,歡迎在看、點(diǎn)贊、轉(zhuǎn)發(fā),您的認(rèn)可是我最大的動(dòng)力。

        整理了幾百本各類技術(shù)電子書,有需要的同學(xué)可以,關(guān)注公眾號(hào)回復(fù)[ 666 ]自取。還有想要加技術(shù)群的同學(xué)可以加我好友,和大佬侃技術(shù)、不定期內(nèi)推,程序員的內(nèi)點(diǎn)事這都有。

        有趣的靈魂在等你
        堅(jiān)持學(xué)習(xí)是一種態(tài)度
        瀏覽 39
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级a免一级a爱片免费兔兔软件 | 日韩精品人妻无码 | 日本三级在线视频 | 女警高潮一级毛毛片 | 一级A片处破外女动漫 | 欧美成人色情网 | 欧洲少妇无码A片在线视频 | 少妇饥渴偷公乱第400章视频 | 亚洲一级aaa | 久久伊人777777 |