本文將主要圍繞Invocation這個抽象概念進行講解,首先來看一下相關的類圖結構。
整體概念
- Invocation,一次具體的調用,包含方法名、參數類型、參數
- Result,一次調用結果,包含value和exception
- Invoker,調用者,對應一個服務接口,通過invoke方法執行調用,參數爲Invocation,返回值爲Result
DubboInvoker
- 通過ExchangeClient發送調用請求(Invocation)
- doInvoke()分爲oneWay、async、sync調用
- 對client的選擇採用輪詢的方式
ThriftInvoker
與sync調用基本相同
AbstractClusterInvoker
- 多個服務端實例組成的集羣,可以設定針對多組實例的選擇策略
- 維護Directory對象,通過list方法查找一個Invocation對應的Invokers
- 具有select方法,invokers作爲參數傳遞給select()
選擇策略:通過LoadBalance來選取Invoker,若選出的Invoker已經被選擇過,則進行reselct()
7種集羣調用策略
FailfastClusterInvoker
select之後只調用一次,失敗立即返回錯誤
FailoverClusterInvoker
重試n次,每次更新selected集合,保證失敗後切換到另一個Invoker
FailbackClusterInvoker
select後發起一次調用,若失敗則將Invoker加入失敗列表,定期重試
FailsafeClusterInvoker
select後發起一次調用,若失敗忽略異常,返回一個空Result
AvailableClusterInvoker
不進行select,僅選取第一個available的Invoker
BroadcastClusterInvoker
不進行select,每個Invoker都調用一次
ForkingClusterInvoker
不進行select,對所有分組並行發起調用,最快的調用完成後返回結果