国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

徹底搞懂如何通過 ZooKeeper 實現注冊中心

開發 架構
我們針對微服務架構中的一個核心技術組件,即注冊中心的基本模型做了展開,并基于 ZooKeeper 這款分布式協調工具重點分析了 Dubbo 中注冊中心的實現方式以及所具備的功能特性。

在微服務架構中,注冊中心屬于一種服務治理組件。服務治理的需求來自于服務的數量,也來自于服務實例的動態性。在服務相互調用的過程中,每個服務首先需要高效地找到目標服務才能執行遠程調用,因此服務治理所承載的服務注冊和發現機制就顯得非常重要了。

而注冊中心就是用來實現服務治理的工具,圍繞注冊中心涉及的角色包括以下三種:

  • 注冊中心:提供服務注冊和發現機制。
  • 服務提供者:將服務本身注冊到注冊中心,進而暴露服務。
  • 服務消費者:從注冊中心發現目標服務,進而消費服務。

微服務架構中的服務提供者和服務消費者可以認為是注冊中心的客戶端,在服務內部都嵌入了客戶端組件。

圖片圖片

上面這張圖所展示的注冊中心基本模型看起來比較簡單,但真正實現起來要考慮的點是非常多的。另一方面,如果想要實現這樣一個注冊中心,我們也需要選擇合適的工具。在今天的課程中,我們選擇的工具是功能、特性都非常適合構建注冊中心的 ZooKeeper,讓我們一起來看一下。

ZooKeeper 與注冊中心

ZooKeeper 的物理結構本質上就是一個文件系統,包含了一系列被稱為 ZNode 的節點。每一節點代表位于文件系統中的一個具體物理路徑,用來存儲數據。

圖片圖片

如上圖,節點 count 位于/business/product/count 路徑,節點 temp 可能存儲著數據 100,而節點/shop/order/1 可能存儲著類似{“id”:“1”,“itemName”:“Notebook”,“price”:“4000”}”這樣的復雜數據結構和信息。ZooKeeper 中所有數據都是通過 ZNode 的路徑被引用的。

介紹完 ZooKeeper 的基本結構,我們來分析為什么它適合實現注冊中心。

事實上,在注冊中心的實現過程中,最復雜的就是變更通知機制,因為它涉及到如何在服務提供者實例狀態發生變更時,有效地通知到服務的消費者,從而避免遠程調用發生失敗。添加了通知機制的注冊中心模型是這樣的:

圖片圖片

我們知道狀態變更管理可以采用發布 - 訂閱模式,具體來說,服務提供者可以根據服務定義發布服務,而服務消費者則通過對自己感興趣的服務進行訂閱,并獲取變更后的服務實例信息。

圖片圖片

上圖展示的就是一種服務監聽機制。有了這一機制,服務提供者實例的狀態一旦發生變化,服務消費者就能第一時間獲取變更通知,從而獲取最新的服務狀態。

那我們如何來實現這種監聽機制呢?ZooKeeper 為我們提供了現成的解決方案,就是 Watcher 機制。這個 Watcher 機制就相當于上圖中所展示的這種監聽器。監聽器通過對 ZNode 進行監聽,確保了節點信息發生變化時能夠實時捕捉到這種變化并把它傳遞到客戶端,從而觸發客戶端的回調處理函數。

從實現上講,ZNode 是開發人員通過代碼操控的主要對象。對 ZNode 的基本操作包括創建節點、獲取子節點以及獲取和設置節點數據等。我們可以通過引入 ZooKeeper 的客戶端組件來實現這些操作,常見的客戶端包括自帶的 ZooKeeper API 和第三方 Curator 等。

ZooKeeper 中涉及的主要操作包含了以下 6 種:

圖片圖片

各種工具框架中對 ZooKeeper 的控制基本都是對這些操作的封裝和應用。基于 ZooKeeper 各項功能特性實現注冊中心的基本思路如下圖:

圖片圖片

可以看到,無論是服務的提供者還是消費者,在服務初始化時都會與 ZooKeeper 服務器建立連接。然后,圖中所展示的發布服務定義、注冊新服務、獲取和監聽服務地址等操作本質上都是對 ZNode 各種基本操作的封裝。當然,作為 ZooKeeper 的客戶端,服務提供者和消費者都需要與 ZooKeeper 保持心跳檢測。

Dubbo 框架默認把 ZooKeeper 作為它的注冊中心實現工具。接下來就讓我們來看看 Dubbo 中的 ZooKeeper 注冊中心。

Dubbo 中的 ZooKeeper 注冊中心

對于 Dubbo 而言,我們首先需要明確保存在 ZNode 中的具體內容,這就是服務提供者和消費者的 URL 信息,它們會被分別保存在 ZooKeeper 的/providers 和/consumers 節點之下。

圖片圖片

同時,服務消費者還會對/providers 節點進行訂閱。這樣,消費者就能實時獲取提供者的 URL 信息。顯然,這個時候我們會對/providers 節點添加 Watcher 機制。

我們進一步分析這些注冊信息,可以看到,Dubbo 對各個節點進行了合理編排,構成了 Root、Service、Type、URL 這樣的服務地址分層結構。

圖片圖片

Dubbo 通過對不同層級節點進行注冊和訂閱,來實現服務地址的發布和推送。當然,這種分層結構對于我們如何組織 ZooKeeper 中的數據有很好的借鑒意義。

接下來,讓我們來看一些 Dubbo 中的源碼。我們來看一下代表注冊中心的 ZookeeperRegistry 類,而 ZookeeperRegistry 中最重要的就是它的構造函數。這是對應的代碼:

public ZookeeperRegistry(URL url, ZookeeperTransporter, zookeeperTransporter) {
        ...
        //構建 Zookeeper 客戶端
     zkClient = zookeeperTransporter.connect(url);
        //添加 Watcher
     zkClient.addStateListener(new StateListener() {
             public void stateChanged(int state) {
                 if (state == RECONNECTED) {
                     try {
                         recover();
                     } catch (Exception e) {
                         logger.error(e.getMessage(), e);
                     }
                 }
             }
         });
 }

不難看出,在 ZookeeperRegistry 的構造函數中,我們通過 ZookeeperClient 客戶端工具創建了與服務器的連接,并且通過 addStateListener 方法添加了監聽器。一旦連接發生重連,就會觸發回復操作。

為了更好地理解這段代碼,我們需要明確另外兩個核心對象的創建過程。這兩個核心對象分別是前面所展示的 ZookeeperTransporter 和 ZookeeperClient,其中 ZookeeperTransporter 根據傳入的 URL,通過創建與 Zookeeper 服務器的連接獲取一個 ZookeeperClient 對象,而 ZookeeperClient 則包含了注冊中心運行過程中所有的數據操作。

圖片圖片

從功能定位上講,我們可以把 ZookeeperTransporter 看做是一種通信層組件,只負責與 ZooKeeper 實現網絡通信,而 ZookeeperClient 則封裝了所有的注冊中心操作方法,是一種業務層組件。Dubbo 在這里所采用的這種分層設計思想同樣值得我們借鑒。

目前可以與 ZooKeeper 服務器進行交互的客戶端有很多,Dubbo 提供了對 Zkclient 和 Curator 這兩個客戶端工具的集成,對應的 Transporter 和 ZookeeperClient 實現類如下所示:

圖片圖片

Dubbo 使用 Zkclient 作為其默認實現。

接下來,我們終于到了分析注冊中心具體操作的時候了。ZookeeperRegistry 提供了 doRegister、doUnregister、doSubscribe 和 doUnsubscribe 方法,分別對應注冊、取消注冊、訂閱和取消訂閱這四個具體操作。其中 doRegister 和 doUnregister 這兩個方法比較簡單,只是直接調用 Zkclient 的 create 和 delete 方法。而 doSubscribe 方法完成服務訂閱操作,代碼比較長,我們提取其中的核心代碼:

ChildListener zkListener = listeners.get(listener);
 if (zkListener == null) {
         listeners.putIfAbsent(listener, new ChildListener() {
                   public void childChanged(String parentPath, List<String>
 currentChilds) {
                        for (String child : currentChilds) {
                             child = URL.decode(child);
                             if (!anyServices.contains(child)) {
                                 anyServices.add(child);
                                     subscribe(url.setPath(child).addParameters(Constants.INTERFACE_KEY, child,Constants.CHECK_KEY, String.valueOf(false)), listener);
                            }
                       }
                   }
             });
         zkListener = listeners.get(listener);
 }

可以看到,Dubbo 會訂閱父級目錄,而當有子節點發生變化時就會觸發 ChildListener 中的回調函數,這個回調函數會對這個路徑下的所有子節點執行訂閱操作。

掌握了服務訂閱的實現過程,理解取消訂閱的原理就很簡單了,我們只要去掉 URL 上已經注冊的監聽器就可以了,doUnsubscribe 方法如下所示:

protected void doUnsubscribe(URL url, NotifyListener listener) {
  ConcurrentMap<NotifyListener, ChildListener> listeners = zkListeners.get(url);
         if (listeners != null) {
             ChildListener zkListener = listeners.get(listener);
             if (zkListener != null) {
                 zkClient.removeChildListener(toUrlPath(url), zkListener);
             }
         }
 }

至此,在 Dubbo 中,如何基于 ZooKeeper 實現注冊中心的實現過程就介紹完了。如果我們想要自己動手實現一個類似的注冊中心,那這個 Dubbo 中的實現過程還是具備很多參考價值的。

總結

我們來總結回顧一下這次講的內容。我們針對微服務架構中的一個核心技術組件,即注冊中心的基本模型做了展開,并基于 ZooKeeper 這款分布式協調工具重點分析了 Dubbo 中注冊中心的實現方式以及所具備的功能特性。

責任編輯:武曉燕 來源: 程序猿技術充電站
相關推薦

2025-01-16 00:20:41

2023-02-26 00:00:00

2023-01-30 22:43:39

DubboZooKeeper

2021-01-06 13:52:19

zookeeper開源分布式

2025-04-21 04:00:00

2020-01-10 10:58:34

ZooKeeperEureka注冊中心

2020-06-29 07:58:18

ZooKeeperConsul 注冊中心

2017-12-05 17:44:31

機器學習CNN卷積層

2020-10-14 08:50:38

搞懂 Netty 線程

2025-06-30 00:32:43

策略模式算法MyBatis

2025-05-06 01:14:00

系統編程響應式

2024-01-03 13:39:00

JS,Javascrip算法

2023-10-18 10:55:55

HashMap

2025-04-11 05:55:00

2025-01-13 16:00:00

服務網關分布式系統架構

2021-10-15 08:32:03

RocketMQ數據結構架構

2023-01-05 07:55:59

Zookeeper服務注冊

2021-10-09 19:05:06

channelGo原理

2025-03-17 00:21:00

2021-10-11 11:58:41

Channel原理recvq
點贊
收藏

51CTO技術棧公眾號

色一情一区二区三区四区| 黄色成人在线免费观看| 精品美女在线观看视频在线观看 | 2019中文字幕全在线观看| 日本va欧美va瓶| 热草久综合在线| 日韩国产一区二区三区| 国产精品视频免费一区| 亚洲午夜激情网页| 3d玉蒲团在线观看| 91中文字幕在线| 94色蜜桃网一区二区三区| 性欧美videosex高清少妇| 高清不卡一区二区| 第四色亚洲色图| 亚洲春色h网| 91久久久久久久久久久久久| 亚洲自啪免费| 日日橹狠狠爱欧美超碰| 亚洲福利视频一区| 国精产品一区一区三区mba下载| 色吧影院999| 久久精品高清| 真人做人试看60分钟免费| 欧美国产成人精品| 国产系列在线观看| 久久精品国产2020观看福利| 日韩1区在线| 美女av免费观看| 亚洲午夜电影在线| 欧美14一18处毛片| 国产精品福利在线播放| 两个人hd高清在线观看| 日韩av一区在线观看| 噜噜噜天天躁狠狠躁夜夜精品| 操一操视频一区| 94色蜜桃网一区二区三区| 日本午夜在线视频| 久久精品国产亚洲7777| 欧美久久九九| 免费看污污网站| 欧美大胆人体bbbb| 免费看成人吃奶视频在线| 制服丝袜综合日韩欧美| 亚洲综合激情另类小说区| а√天堂中文资源在线bt| 九九热最新视频//这里只有精品| 美女视频黄a视频全免费观看| 精品sm捆绑视频| 欧美亚洲在线日韩| 国产午夜福利在线播放| 7799精品视频| 国产传媒欧美日韩成人精品大片| 亚洲精品一区二区三区福利 | 久久人人超碰| 性欧美xxxx| 国产一区二区高清| 天天爽人人爽夜夜爽| 亚洲第一免费播放区| 久久久久久久久久久久久久久久久久 | 成人免费观看网站| 中文字幕亚洲在| 阿v视频在线| 亚洲最大激情中文字幕| 国产精品人人做人人爽人人添| 黄色羞羞视频在线观看| 999国内精品视频在线| 中文天堂在线一区| 麻豆mv在线观看| 久久久综合香蕉尹人综合网| 亚洲麻豆国产自偷在线| 日本人体一区二区| 亚洲午夜羞羞片| 日本在线成人| www.xxx麻豆| 日韩av最新在线| 视频一区二区欧美| 中国日本在线视频中文字幕| 91热精品视频| 亚洲一区影音先锋| 全球av集中精品导航福利| 日本久久精品一区二区| 中文字幕亚洲二区| 国产91对白在线观看九色| а√在线中文网新版地址在线| 欧美不卡福利| 欧美视频第二页| 波多野结衣在线观看一区二区 | 成人黄色免费网站| 亚洲色婷婷久久精品av蜜桃| 亚洲电影成人av99爱色| 国产女优一区| 欧美人与牲禽动交com | 成人一级福利| 午夜老司机精品| 在线不卡免费欧美| 亚洲精品乱码| 国产人成网在线播放va免费| 欧洲国产精品| 欧美一级午夜免费电影| 三级精品在线观看| 91探花在线观看| 日韩欧美一级在线| 国产一区二区三区在线观看网站 | 国产一区二区无遮挡| 欧美天天综合色影久久精品| 欧美成免费一区二区视频| 在线黄色国产电影| 亚洲最大成人网色| 欧美精选午夜久久久乱码6080| 亚洲综合日本| 亚洲天堂电影| 91专区在线观看| 97视频在线播放| 亚洲一区二区视频| 伊人天天综合| 欧美黑人猛交| 国产女教师bbwbbwbbw| 欧美日本黄视频| 国产伦精品一区二区三区在线播放| 国产精品免费成人| 国产精品99久久久久久www| 色爱区综合激月婷婷| 老鸭窝亚洲一区二区三区| 久久久久黄久久免费漫画| 日本黄大片在线观看| 久久久久久久爱| 色综合久久久久综合| 丝袜美腿亚洲一区| 国产精区一区二区| 一二三四社区在线视频| 欧美大香线蕉线伊人久久国产精品| 亚洲第一色在线| 久久青草国产手机看片福利盒子 | 韩国一区二区三区视频| 欧美激情精品久久久久久免费印度| 久久久www免费人成精品| 精品日韩毛片| 嫩草香蕉在线91一二三区| 免费一级特黄特色毛片久久看| 欧美有码在线观看视频| 欧美精品三级日韩久久| 99久久精品免费看| 久久社区一区| 欧美va在线观看| 色视频www在线播放| 福利视频导航一区| 有码av在线| 午夜在线观看91| av影片在线| 国产日韩欧美麻豆| 亚洲婷婷影院| 日本美女在线中文版| 97在线免费视频观看| 欧美黑人xxx| 欧美日韩国产美| 国产东北露脸精品视频| 日本一区二区三区视频| 2021中文字幕在线| 亚洲一级片网站| 国产h色视频在线观看| www.日本久久久久com.| 亚洲一区二区三区激情| 亚洲免费视频一区二区三区| 美女久久久久| 久久久午夜电影| 美女搞黄视频在线观看| 久久影院中文字幕| 欧美午夜电影在线| 国产成人午夜片在线观看高清观看| 成人av动漫在线观看| 日韩成人影音| 精品视频三区| www午夜视频| 手机看片福利永久国产日韩| 青草成人免费视频| 亚洲免费视频观看| 色欧美片视频在线观看在线视频| 成人激情文学综合网| 999在线观看精品免费不卡网站| 成人看片黄a免费看视频| h片在线观看| 国产美女性感在线观看懂色av| 99re在线视频免费观看| 亚洲午夜精品久久久中文影院av| 国产精品99导航| 精品中文字幕乱| 91精品国产综合久久久蜜臀粉嫩| 亚洲综合自拍偷拍| av男人天堂一区| 极品少妇xxxx偷拍精品少妇| 欧美视频久久| 免费短视频成人日韩| 欧美久久久网站| 伦理av在线| 老司机在线视频二区| 在线资源免费观看| 亚洲免费成人av电影| 亚洲va欧美va国产va天堂影院| 国产丝袜欧美中文另类|