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

2021-09-10 07:58:21 字數 2813 閱讀 7953

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

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

集群:同乙個業務,部署在多個伺服器上

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

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

cluster:directory 中的多個 invoker 偽裝成乙個 invoker,對上層透明,偽裝過程包含了容錯邏輯,呼叫失敗後,重試另乙個

directory:代表多個 invoker,可以把它看成 list,但與 list 不同的是,它的值可能是動態變化的,比如註冊中心推送變更

router : 負責從多個invoker 中按路由規則選出子集,比如讀寫分離,應用隔離等

loadbalance:loadbalance 負責從多個 invoker 中選出具體的乙個用於本次呼叫,選的過程包含了負載均衡演算法,呼叫失敗後,需要重選.

下面我們來分析一下 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原始碼分析13 之 集群容錯 Invoke

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

dubbo原始碼分析17 集群容錯總結

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

dubbo原始碼解析 集群容錯架構設計

本來是想把整個dubbo原始碼解析一次性弄完,再做成乙個系列來發布的,但是正巧最近有位好朋友要去杭州面試,就和我交流了一下.本著對dubbo原始碼略有心得的心態,在交流過程中也發表了個人的一些粗劣的拙見.但是非常不幸的是,交流過程中我這位朋友問到了幾個問題,我卻沒能回答得上,讓我感到十分慚愧.故而將...