前面咱們已經看過了dubbo的服務引入以及服務導出的源碼,下面我來看一下dubbo的集羣容錯的源碼html
1、相關組件關係apache
dubbo中的集羣容錯方式說明:緩存
能夠看到這個doJoin是一個模板方法安全
這裏其實很簡單只是簡單的建立了一個ClusterInvoker服務器
二、Invoker負載均衡
這裏能夠看到invoke主要是從directory中獲取invokerList以及獲取負載均衡器,並將調用委派給子類dom
下面咱們再看一下org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke的具體實現ide
從上圖咱們能夠發現這裏主要作幾件事:ui
一、經過方法名稱獲取重試次數spa
二、遍歷重試次數並作負載均衡
三、發起調用
這裏又是一個模板方法咱們來看一下他的默認實現類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執行
AbstractDirectory是Directory 中有一個基礎的實現類,主要是對一些通用的方法封裝,主要仍是依靠子類真正的實現。
那麼Directory是何時產生的呢?咱們能夠回想一下服務引用的時候是否是也見過RegistryDirectory呢?下面再看一下代碼法
是否是很熟悉啊
好了,到這裏咱們的集羣容錯機制的源碼基本就完事了