ZooKeeper 的應用
1. 前言
在分布式應用中,我們除了單獨使用 Zookeeper 來實現分布式鎖、配置中心等功能外,在我們使用一些優秀的框架時,比如高性能的分布式流處理平臺 Apache Kafka,高性能的 Java RPC 框架 Apache Dubbo,它們也不同程度的依賴于 Zookeeper 服務,來實現一些特定的功能。
在本節內容中,我們就來學習在 Kafka 和 Dubbo 中,是如何使用 Zookeeper 的。
2. Zookeeper 在 Kafka 中的應用
在學習 Zookeeper 在 Kafka 中的應用之前,我們先來簡單的了解一下 Kafka。
2.1 Kafka 簡介
Apache Kafka 是一個高性能的分布式流處理平臺,它可以做什么呢?
- Kafka 可以發布和訂閱消息。
- Kafka 可以儲存消息。
- Kafka 可以在消息產生時就進行處理。
了解了 Kafka 可以實現的一些功能,接下來我們需要了解的是 Kafka 系統的組成有哪些:
- Broker: 消息管理者,Kafka 通常使用集群模式來提供服務,集群中的單個 Kafka 節點就稱為 Broker;
- Topic: 消息的主題,用于區分消息的類型,保存在 Broker 中;
- Partition: 消息的分區,Topic 下可以有一個或者多個分區;
- Producer: 消息生產者,Producer 將消息發布到 Topic 中,由 Broker 把消息存放到 Partition 中;
- Consumer:消息消費者,Consumer 從 Broker 中的 Topic 拉取消息,可以拉取多個 Topic 的消息;
- Consumer Group: 消費者分組,對 Consumer 進行分組,方便對多個 Consumer 進行消息廣播;
- Leader: 分區副本的領導者,當前負責讀寫操作的 Partition;
- Follower: Leader 的跟隨者,會同步 Leader 的數據,Leader 失效后從 Follower 中選舉 Leader ;
- Offset: Partition 消息的消費數量記錄。
簡單的了解了 Kafka,接下來我們就來介紹 Zookeeper 在 Kafka 中的應用。
2.2 Zookeeper 在 Kafka 中的應用
- Topic 配置管理: Topic 的配置會注冊到 Zookeeper 中 的 config 節點下,根據 config 節點來動態更新配置;
- Broker 管理: 在每個 Broker 啟動時,都會注冊到 Zookeeper 的 brokers 節點下;
- Topic 及 Partition 管理: Topic 會注冊到 brokers 節點下的 topics 節點下,Partition 會注冊到 Topic 的節點下;
- Producer 負載均衡: Producer 將消息發布到 Topic 時,會根據 Zookeeper 的 brokers 節點下的 Broker 來進行動態的負載均衡;
- Consumer 負載均衡: Consumer 從 Topic 拉取消息時,同樣也需要根據 Zookeeper 的 brokers 節點下的 Broker 來進行動態的負載均衡;
- 消費管理: 每個 Partition 只能被 Consumer Group 中的一個 Consumer 進行消費,因此需要關聯 Partition 與 Consumer 之間的關系,將 Consumer 的 Consumer ID 注冊到相關聯的 Partition 節點的臨時節點上;
- Offset 記錄: 在 Consumer 對指定 Partition 進行消息消費的過程中,需要將 Partition 的消費數量記錄到 Zookeeper 中。
介紹完一部分 Zookeeper 在 Kafka 中的應用,接下來我們就來介紹在 Dubbo 中 Zookeeper 的應用。
3. Zookeeper 在 Dubbo 中的應用
首先我們來簡單的了解一下 Dubbo 是什么,再來介紹 Zookeeper 在 Dubbo 中的應用。
3.1 Dubbo 簡介
Apache Dubbo 是一款高性能、輕量級的開源 Java RPC 框架,它提供了三大核心能力:
- 面向接口的遠程方法調用;
- 智能容錯和負載均衡;
- 服務自動注冊和發現。
下面是一張來自 Dubbo 官網的結構圖:
從圖中我們可以看到,Dubbo 的組件一共有 5 部分:
- Container 容器;
- Provider 服務提供者;
- Consumer 服務消費者;
- Registry 注冊中心;
- Monitor 監控中心。
我們來講解一下它們之間的調用關系:
- 從 Container 中啟動服務提供者 Provider;
- Provider 服務提供者把自己注冊到 Registry 注冊中心;
- Consumer 服務消費者從 Registry 注冊中心訂閱服務;
- Registry 注冊中心發送 Provider 的服務地址給 Consumer 服務消費者;
- Consumer 服務消費者遠程調用 Provider 服務提供者的服務;
- Consumer 和 Provider 的調用情況定時發送到 Monitor 監控中心。
簡單的介紹了 Dubbo,接下來我們就來介紹 Zookeeper 在 Dubbo 中的應用。
3.2 Zookeeper 在 Dubbo 中的應用
在 Dubbo 官方網站中的注冊中心參考手冊中, Dubbo 官方推薦 Zookeeper 作為注冊中心。下面是一張來自 Dubbo 官網的 Zookeeper 節點結構圖:
我們來分析一下節點的結構,根據 Zookeeper 的樹狀結構,Dubbo 把節點分為 4 層:
- 第一層為 Root 節點,固定為 dubbo;
- 第二層為服務節點,我們可以根據不同的服務來注冊不同的服務節點,同時 Monitor 會監聽服務節點;
- 第三層為服務的類型,分別為服務提供者和服務消費者,固定為 providers 和 consumers ;
- 第四層為服務提供者和服務消費者的 URL,如果是 Provider 就會注冊到 providers 節點下的臨時節點。如果是 Consumer 就注冊到 consumers 節點下的臨時節點,并且對同一服務下的 providers 開啟監聽。
我們來總結一下 Zookeeper 作為注冊中心的原理:服務提供者把 URL 注冊到 providers 下的臨時節點,服務消費者從 providers 獲取 URL 列表,并對 providers 開啟子節點事件的監聽。根據 Zookeeper 臨時節點的特性,服務提供者只要與 Zookeeper 斷開連接,Zookeeper 服務就會把該臨時節點移除,此時服務消費者就會收到 providers 的子節點移除事件,然后更新自己的服務提供者的 URL 列表。
4. 總結
在本節內容中,我們學習了在 Kafka 和 Dubbo 中 Zookeeper 的應用,其實 Zookeeper 的應用就是根據它的樹狀結構,節點的特性以及節點的監聽機制,同學們在使用 Zookeeper 時可以利用好這些點。以下是本節內容總結:
- Zookeeper 在 Kafka 中的應用。
- Zookeeper 在 Dubbo 中的應用。