dubbo原始碼分析13 之 集群容錯 Invoke

2021-08-21 02:58:47 字數 3379 閱讀 3329

在集中式環境中服務的機器臺只有一台,這樣對於服務不僅存在服務單點故障問題而且還存在流量問題。為了解決這個問題,就引入的分布式與集群概念。

>分布式:乙個業務分拆多個子業務,部署在不同的伺服器上 >集群:同乙個業務,部署在多個伺服器上

當請求來臨時,如何從多個伺服器中,選擇乙個有效、合適的伺服器,這個集群所需要面對一問題。所以在集群裡面就引申出負載均衡(loadbalance),高可用(ha),路由(route)等概念。我們來看一下 dubbo 在進行服務呼叫的時候是如何處理的。

這張集群容錯包含以下幾個角色:

我們再來對照看一下 dubbo 的核心架構圖。

通過之前的一系列的原始碼分析,以及上面的二張 dubbo 架構圖,我們不難得出以下結論。

當 dubbo 的 provider 進行一次服務暴露的時候,就會有 registry 註冊乙個服務,然後通過 netty 進行暴露請求。當 consumer 需要進行服務呼叫的時候,通過 cluster 把多個服務偽裝成乙個 invoke,這樣對呼叫方就不需要關心到底有多少個服務呼叫方了。

集群通過到註冊中心去拿暴露當前服務的介面資訊的獲取到 directory (服務列表),然後通過配置的 route (路由規則) 找到滿足的 invoke 列表,最後通過 loadbalance 找到合適的乙個 invoke 進行遠端呼叫。在集群呼叫失敗時,dubbo 提供了多種容錯方案,預設為 failover 重試。這樣就對服務的高可用做到了保證。 在集中式環境中服務的機器臺只有一台,這樣對於服務不僅存在服務單點故障問題而且還存在流量問題。為了解決這個問題,就引入的分布式與集群概念。

>分布式:乙個業務分拆多個子業務,部署在不同的伺服器上 >集群:同乙個業務,部署在多個伺服器上

當請求來臨時,如何從多個伺服器中,選擇乙個有效、合適的伺服器,這個集群所需要面對一問題。所以在集群裡面就引申出負載均衡(loadbalance),高可用(ha),路由(route)等概念。我們來看一下 dubbo 在進行服務呼叫的時候是如何處理的。

這張集群容錯包含以下幾個角色:

下面我們來分析一下 cluster, 也就是集群。集群裡面包含:集群與容錯兩個概念。下面我們來看一下維基百科對於集群與容錯的描述。

2.1 集群

計算機集群是一組鬆散或緊密連線的計算機,它們協同工作,因此在許多方面,它們可以被看作是乙個單一的系統。與網格計算機不同,計算機集群使每個節點集執行相同的任務,由軟體控制和排程。

集群的元件通常通過快速的本地區域網路連線到一起,每個節點(計算機用作伺服器)執行自己的作業系統例項。在大多數情況下,所有的節點都使用相同的硬體1更好的源和相同的作業系統,儘管在某些設定中(例如使用開放原始碼集群應用程式資源(oscar)),不同的作業系統可以在每個計算機或不同的硬體上使用。

2.2 容錯

容錯是一種屬性,它使系統能夠在出現故障(或內部乙個或多個故障)的情況下繼續正常執行。如果它的執行質量下降,那麼下降與失敗的嚴重程度成正比,與乙個天真的設計系統相比,即使是很小的故障也會導致完全崩潰。

在高可用性或生命關鍵系統中,容錯是特別需要的。當系統的某些部分被分解時,維護功能的能力被稱為優雅的降級

下面我們來看一下 cluster & invoker 的介面定義

> cluster

@spi(failovercluster.name)

public inte***ce cluster

cluster 只定義了乙個方法join,它的作用是將目錄下面的 invoker 列表合併到虛擬呼叫程式中。其實就是把 provider 端暴露的呼叫合併到乙個集群當中。外部呼叫的時候不管這個服務到底有幾個提供者,cluster 將 directory 中的多個 invoker 偽裝成乙個 invoker,對上層透明,偽裝過程包含了容錯邏輯,呼叫失敗後,重試另乙個。

> invoker

public inte***ce invokerextends node
invoker 是 dubbo 領域模型中非常重要的乙個概念,很多設計思路都是向它靠攏。這就使得 invoker 滲透在整個實現**裡。 下面我們用乙個官方的圖來說明最重要的兩種 invoker:服務提供 invoker 和服務消費 invoker:

為了更好的解釋上面這張圖,我們結合服務消費和提供者的**示例來進行說明:

> 服務消費者**:

public class democlientaction 

public void start()

}

上面**中的demoservice就是上圖中服務消費端的 proxy,使用者**通過這個 proxy 呼叫其對應的invoker5

,而該invoker實現了真正的遠端服務呼叫。

> 服務提供者**:

public class demoserviceimpl implements demoservice 

}

在 dubbo 原始碼中, 在包com.alibaba.dubbo.rpc.cluster.support中,我們可以看到 cluster 和 invoker 是成對出現的。

下面我們通過類圖來看一下它們之間的關係:

每乙個 cluster 其實都是建立乙個 cluster 呼叫的例項,cluster 把集群呼叫功能委託給 abstractclusterinvoker (抽象集群呼叫)。其實最終返回給 consumer 的 invoker 例項是 mockclusterinvoker 物件。這個物件持有乙個 registrydirectory 例項(服務自動發現與註冊)與乙個 failoverclusterinvoker 例項(失敗轉移,當出現失敗,重試其它伺服器,通常用於讀操作,但重試會帶來更長延遲。)

集群容錯主要包括以下幾種模式:

dubbo原始碼分析之集群容錯failover 13

在集中式環境中服務的機器臺只有一台,這樣對於服務不僅存在服務單點故障問題而且還存在流量問題。為了解決這個問題,就引入的分布式與集群概念。分布式 乙個業務分拆多個子業務,部署在不同的伺服器上 集群 同乙個業務,部署在多個伺服器上 當請求來臨時,如何從多個伺服器中,選擇乙個有效 合適的伺服器,這個集群所...

Dubbo原始碼分析

dubbo原始碼分析 其實已經有很多比較好的原始碼分析部落格,結合部落格和開發經驗再去分析原始碼,就能對dubbo的實現有個整體全面的理解,也能深入去深究其中的具體實現細節。dubbo裡主要用到的spi service provider inte ce netty nio 同步非阻塞多路復用框架,d...

Dubbo原始碼分析之SPI(二)

本篇文章是dubbo spi原始碼分析的第二篇,接著第一篇繼續分析dubbo spi的內容,我們主要介紹 getdefaultextension 獲取預設擴充套件點方法。由於此方法比較簡單,我們略過示例部分,直接分析原始碼。獲取預設擴充套件方法getdefaultextension 是乙個publi...