圖解!微服務為什么一定要Zookeeper?
原文地址 https://blog.csdn.net/Mkhaixian2014/article/details/89980476
微服務中 Zookeeper 的應用及原理
一、背景
二、Zookeeper 的特性
1. 樹狀目錄結(jié)構(gòu)
2. 持久節(jié)點 (Persistent)
3. 持久有序節(jié)點 (Persistent_sequential)
4. 臨時節(jié)點 (Ephemeral)
5. 臨時有序節(jié)點 (Ephemeral_sequential)
6. 節(jié)點監(jiān)聽 (Wacher)
三、微服務中應用場景
1. 分布式鎖
2. 服務注冊與發(fā)現(xiàn)
2.1 背景
2.2 服務注冊原理
2.3 服務動態(tài)發(fā)現(xiàn)原理
一、背景
了解微服務的小伙伴都應該知道 Zookeeper,ZooKeeper 是一個分布式的, 開源的分布式應用程序協(xié)調(diào)服務?,F(xiàn)在比較流行的微服務框架 Dubbo、Spring Cloud 都可以使用 Zookeeper 作為服務發(fā)現(xiàn)與組冊中心。但是,為什么 Zookeeper 就能實現(xiàn)服務發(fā)現(xiàn)與組冊呢?
二、Zookeeper 的特性
我們先來了解一下 Zookeeper 的特性吧,因為它的特性決定了它的使用場景。
1. 樹狀目錄結(jié)構(gòu)

如上圖,Zookeeper 是一個樹狀的文件目錄結(jié)構(gòu),有點想應用系統(tǒng)中的文件系統(tǒng)的概念。每個子目錄(如 App)被稱為 znode,我們可以對每個 znode 進行增刪改查。
2. 持久節(jié)點 (Persistent)

客戶端與 zookeeper 服務端斷開連接后,該節(jié)點仍然存在。
3. 持久有序節(jié)點 (Persistent_sequential)
在持久節(jié)點基礎上,由 zookeeper 給該節(jié)點名稱進行有序編號,如 0000001,0000002。
4. 臨時節(jié)點 (Ephemeral)

客戶端與 zookeeper 服務端斷開連接后,該節(jié)點被刪除。臨時節(jié)點下,不存在子節(jié)點。
5. 臨時有序節(jié)點 (Ephemeral_sequential)
在臨時節(jié)點基礎上,由 zookeeper 給該節(jié)點名稱進行有序編號,如 0000001,0000002。
6. 節(jié)點監(jiān)聽 (Wacher)

客戶端 2 注冊監(jiān)聽它關心的臨時節(jié)點 SubApp1 的變化,當臨時節(jié)點 SubApp1 發(fā)生變化時(如圖中被刪除的時候),zookeeper 會通知客戶端 2。
該機制是 zookeeper 實現(xiàn)分布式協(xié)調(diào)的重要特性。我們可以通過 get,exists,getchildren 三種方式對某個節(jié)點進行監(jiān)聽。但是該事件只會通知一次。
三、微服務中應用場景
1. 分布式鎖
分布式鎖主要解決不同進程中的資源同步問題。大家可以聯(lián)想一下單進程中的多線程共享資源的情況,線程需要訪問共享資源,首先要獲得鎖,操作完共享資源后便釋放鎖。分布式中,上述的鎖就變成了分布式鎖了。那這個分布式鎖又是如何實現(xiàn)呢?
步驟 1: 如圖,根據(jù) zookeeper 有序臨時節(jié)點的特性,每個進程對應連接一個有序臨時節(jié)點(進程 1 對應節(jié)點 / znode/00000001,進程 2 對應節(jié)點 / znode/00000002… 如此類推)。每個進程監(jiān)聽對應的上一個節(jié)點的變化。編號最小的節(jié)點對應的進程獲得鎖,可以操作資源。
步驟 2: 當進程 1 完成業(yè)務后,刪除對應的子節(jié)點 / znode/00000001,釋放鎖。此時,編號最小的鎖便獲得鎖(即 / znode/00000002 對應進程)。
重復以上步驟,保證了多個進程獲取的是同一個鎖,且只有一個進程能獲得鎖,就是 zookeeper 分布式鎖的實現(xiàn)原理。
2. 服務注冊與發(fā)現(xiàn)
2.1 背景

在微服務中,服務提供方把服務注冊到 zookeeper 中心去如圖中的 Member 服務,但是每個應用可能拆分成多個服務對應不同的 Ip 地址,zookeeper 注冊中心可以動態(tài)感知到服務節(jié)點的變化。
服務消費方(Order 服務)需要調(diào)用提供方(Member 服務)提供的服務時,從 zookeeper 中獲取提供方的調(diào)用地址列表,然后進行調(diào)用。這個過程稱為服務的訂閱。
2.2 服務注冊原理

rpc 框架會在 zookeeper 的注冊目錄下,為每個應用創(chuàng)建一個持久節(jié)點,如 order 應用創(chuàng)建 order 持久節(jié)點,member 應用創(chuàng)建 member 持久節(jié)點。
然后在對應的持久節(jié)點下,為每個微服務創(chuàng)建一個臨時節(jié)點,記錄每個服務的 URL 等信息。
2.3 服務動態(tài)發(fā)現(xiàn)原理

由于服務消費方向 zookeeper 訂閱了(監(jiān)聽)服務提供方,一旦服務提供方有變動的時候(增加服務或者減少服務),zookeeper 就會把最新的服務提供方列表(member list)推送給服務消費方,這就是服務動態(tài)發(fā)現(xiàn)的原理。
