3、dubbo的集羣容錯源碼剖析

前面咱們已經看過了dubbo的服務引入以及服務導出的源碼,下面我來看一下dubbo的集羣容錯的源碼html

1、相關組件關係apache

dubbo中的集羣容錯方式說明:緩存

Failover Cluster - 失敗自動切換 失敗時會重試其它服務器
Failfast Cluster - 快速失敗 請求失敗後快速返回異常結果 不重試
Failsafe Cluster - 失敗安全 出現異常 直接忽略 會對請求作負載均衡
Failback Cluster - 失敗自動恢復 請求失敗後 會自動記錄請求到失敗隊列中
Forking Cluster - 並行調用多個服務提供者 其中有一個返回 則當即返回結果
2、相關組件源碼剖析
一、Cluster以及他的默認實現類
 

 

 

 

 

 能夠看到這個doJoin是一個模板方法安全

 

 

 這裏其實很簡單只是簡單的建立了一個ClusterInvoker服務器

 

 

 

 二、Invoker負載均衡

 

 

 

 

 

 

 這裏能夠看到invoke主要是從directory中獲取invokerList以及獲取負載均衡器,並將調用委派給子類dom

下面咱們再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具體實現ide

 

 

 從上圖咱們能夠發現這裏主要作幾件事:ui

  一、經過方法名稱獲取重試次數spa

  二、遍歷重試次數並作負載均衡

  三、發起調用

 

 

 

三、LoadBalance

 

 

 

 

 

 這裏又是一個模板方法咱們來看一下他的默認實現類org.apache.dubbo.rpc.cluster.loadbalance.RandomLoadBalance的doSelect

 

 

 實現思路就是全部invoker的權重是否相同,若是相同則隨機選一個invoker

不然把全部invoker的權重總和加起來,而後再[0,total]中產生一個隨機數,找到第一個匹配到這個隨機數的invoker

四、Invoker的執行邏輯

org.apache.dubbo.rpc.protocol.AbstractInvoker#invoke

 

 

 

 

 

 這裏主要使用org.apache.dubbo.remoting.exchange.ExchangeClient發送請求

 

 

 

 

 

 

 

 

 

 

 

 最終會交給org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeChannel#request執行

 

 

這裏的 Channle 對象是經過Transporter 這個SPI進行建立的,netty協議也就是在這裏建立的
五、信息緩存組件Directory
主要用於緩存當前能夠被調用的提供者列表信息。咱們在消費者進行調用時都會經過這個接口來獲取全部的提供者列表,再進行後續處理

 

 AbstractDirectory是Directory 中有一個基礎的實現類,主要是對一些通用的方法封裝,主要仍是依靠子類真正的實現。

 

 

 

 那麼Directory是何時產生的呢?咱們能夠回想一下服務引用的時候是否是也見過RegistryDirectory呢?下面再看一下代碼法

 

 

 

 是否是很熟悉啊

好了,到這裏咱們的集羣容錯機制的源碼基本就完事了

相關文章
相關標籤/搜索