Dubbo+Zookeeper(二)Dubbo架構

茶底世界發表於2021-01-14

上次更新部落格已經是一年前,這一年發生了很多事,並不順利,甚至有些痛苦,不過不管怎樣,不要停止學習,只有學習才能讓你變強,應對更多不安定。

一、RPC概念

Dubbo服務是一個RPC框架,那我們首先就要先理解什麼叫做RPC, Remote Procedure Call 即遠端過程呼叫。

遠端過程呼叫相對的是本地過程呼叫,本地過程呼叫就不用說了,簡單理解成本地方法呼叫函式即可,而遠端呼叫是指呼叫另一個地址空間(通常是共享網路的另一臺機器上)的過程或函式。而不用程式設計師顯式編碼這個遠端呼叫的細節。即程式設計師無論是呼叫本地的還是遠端的函式,本質上編寫的呼叫程式碼基本相同。

RPC的基本架構圖如下:

 

 RPC框架就是圖中的client stub 和說server stub,服務間要相互呼叫,需要先建立連線。當客戶端呼叫client stub,可能需要傳遞引數,而在網路間傳遞,需要進行序列化,序列化完全後將需要呼叫的訊息傳送給server stub,服務端收到資訊後,先反序列化,然後再呼叫本地服務,呼叫完本地服務後,返回處理結果,結果也需要進行序列化,序列化完成之後再返回訊息,而client stub 收到訊息,也需要再次反序列化,再轉換成呼叫結果,這就是一個完整的RPC過程,如圖所示:

 

 

RPC 框架就是要實現像那小助手一樣的東西,目的就是讓我們使用遠端呼叫像本地呼叫一樣簡單方便,並且解決一些遠端呼叫會發生的一些問題 ,對於我們來說是無感知的。

在示例圖中我們也可以看出,RPC的核心模組就是通訊,序列化

那如果讓我們來設計一個RPC框架,我們的設計思路應該是怎麼樣的呢?

首先從服務呼叫者開始,這是一個消費方,我們要消費一個服務,那麼這種服務應該是一個介面形式的,這個介面一般是一個公用jar包來定義,當我知道需要呼叫什麼介面時,具體的實現不需要清楚,這些都應該是框架代理來做的,我只需要帶介面和引數即可。

消費方不需要知道其中細節,不需要知道要呼叫那臺伺服器上的服務,這個時候應該有一個註冊中心,這個註冊中心有點類似公司大樓的前臺物業,他負責指引來客人找到找入駐本棟大樓的公司,每個公司類似服務提供者,公司入駐大大樓後,將自己的樓層和門牌號告訴前臺,前臺把公司的情況貼在前臺指引,那麼當有人要找到公司提供服務時,可以直接通過門牌找到想要去的公司,而這個公司搬走後,前臺物業又將此公司去掉,消費者需要的伺服器是可以直接找到對應公司。

當然,如果你直接告訴了客戶你的具體位置,那麼客戶可以不需要去註冊中心找你,也就是註冊中心可以不需要

那作為服務提供者,你要告訴別人你公司能提供的伺服器,去實現對應的介面 ,然後暴露出去,也就是去向註冊中心註冊自己,暴露自己所能提供的服務。 然後有消費者請求過來需要處理,提供者需要用和消費者協商好的協議來處理這個請求,然後做反序列化

面對眾多的服務,精細化的監控和方便的運維必不可少。 這個時候我們需要監控運維 ,也就是監控中心,當然如果你要這麼莽,就是不需要監控,當然也是可以的。

到此,我們能想到的架構就是如此,接下里我們就來看看dubbo設計(當然,我是通過實際架構反推出來,手動狗頭)

二、Dubbo 核心概念

Dubbo 是阿里巴巴 2011年開源的一個基於 Java 的 RPC 框架,中間沉寂了一段時間,不過其他一些企業還在用 Dubbo 並自己做了擴充套件,比如噹噹網的 Dubbox,還有網易考拉的 Dubbok。

在 2018 年和 Dubbox 進行了合併,並且進入 Apache 孵化器,在 2019 年正式成為 Apache 頂級專案。

學習一門技術,如果有官網的話我們儘量從官網上學習:http://dubbo.apache.org/

首先我們要知道Dubbo有哪些特性:

  • 面向介面代理的高效能RPC呼叫: 提供高效能的基於代理的遠端呼叫能力,服務以介面為粒度,為開發者遮蔽遠端呼叫底層細節。

  • 智慧負載均衡: 內建多種負載均衡策略,智慧感知下游節點健康狀況,顯著減少呼叫延遲,提高系統吞吐量。

  • 服務自動註冊與發現: 支援多種註冊中心服務,服務例項上下線實時感知。

  • 高度可擴充套件能力: 遵循微核心+外掛的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴充套件點,平等對待內建實現和第三方實現。

  • 執行期流量排程: 內建條件、指令碼等路由策略,通過配置不同的路由規則,輕鬆實現灰度釋出,同機房優先等功能。

  • 視覺化的服務治理與運維: 提供豐富服務治理、運維工具:隨時查詢服務後設資料、服務健康狀態及呼叫統計,實時下發路由策略、調整配置引數。

三、架構圖

我們先來看看架構圖:

 

 

架構分為5個節點:

服務提供者( Provider ):暴露服務的服務提供方,服務提供者在啟動時,向註冊中心註冊自己提供的服務。

服務消費者( Consumer ): 呼叫遠端服務的服務消費方,服務消費者在啟動時,向註冊中心訂閱自己所需的服務,服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。

註冊中心( Registry ):註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者

監控中心( Monitor ):服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心

服務執行容器 ( Container ) :負責啟動,載入,執行服務提供者

他們的呼叫關係如下:

  1. 服務容器負責啟動,載入,執行服務提供者。

  2. 服務容器負責啟動,載入,執行服務提供者。

  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。

  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。

  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。

  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

dubbo的架構非常清晰,也很容易理解,我們在學習的時候,先了解清楚架構情況,然後學會使用,然後再去看原始碼,瞭解基礎的程式碼結構。

四、特性

Dubbo 架構具有以下幾個特點,分別是連通性、健壯性、伸縮性。

連通性:

  • 註冊中心負責服務地址的註冊與查詢,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小

  • 監控中心負責統計各服務呼叫次數,呼叫時間等,統計先在記憶體彙總後每分鐘一次傳送到監控中心伺服器,並以報表展示

  • 服務提供者向註冊中心註冊其提供的服務,並彙報呼叫時間到監控中心,此時間不包含網路開銷

  • 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載演算法直接呼叫提供者,同時彙報呼叫時間到監控中心,此時間包含網路開銷

  • 註冊中心,服務提供者,服務消費者三者之間均為長連線,監控中心除外

  • 註冊中心通過長連線感知服務提供者的存在,服務提供者當機,註冊中心將立即推送事件通知消費者

  • 註冊中心和監控中心全部當機,不影響已執行的提供者和消費者,消費者在本地快取了提供者列表

  • 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者

健壯性:

  • 監控中心宕掉不影響使用,只是丟失部分取樣資料

  • 資料庫宕掉後,註冊中心仍能通過快取提供服務列表查詢,但不能註冊新服務

  • 註冊中心對等叢集,任意一臺宕掉後,將自動切換到另一臺

  • 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地快取通訊

  • 服務提供者無狀態,任意一臺宕掉後,不影響使用

  • 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復

伸縮性:

  • 註冊中心為對等叢集,可動態增加機器部署例項,所有客戶端將自動發現新的註冊中心

  • 服務提供者無狀態,可動態增加機器部署例項,註冊中心將推送新的服務提供者資訊給消費者

好了,Dubbo架構我們有了基礎的瞭解,接下來,我們開始實際例子的開發。

相關文章