dubbo框架設計學習

xkzhangsanx發表於2019-07-20

1.整體設計

(1)架構圖

/dev-guide/images/dubbo-framework.jpg

圖例說明:

  • 圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面,位於中軸線上的為雙方都用到的介面。
  • 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關係,每一層都可以剝離上層被複用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
  • 圖中綠色小塊的為擴充套件介面,藍色小塊為實現類,圖中只顯示用於關聯各層的實現類。
  • 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法呼叫過程,即執行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為呼叫的方法。

各層說明:

  • config 配置層:對外配置介面,以 ServiceConfigReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類
  • proxy 服務代理層:服務介面透明代理,生成服務的客戶端 Stub 和伺服器端 Skeleton, 以 ServiceProxy為中心,擴充套件介面為 ProxyFactory
  • registry 註冊中心層:封裝服務地址的註冊與發現,以服務 URL 為中心,擴充套件介面為 RegistryFactoryRegistryRegistryService
  • cluster 路由層:封裝多個提供者的路由及負載均衡,並橋接註冊中心,以 Invoker 為中心,擴充套件介面為 ClusterDirectoryRouterLoadBalance
  • monitor 監控層:RPC 呼叫次數和呼叫時間監控,以 Statistics 為中心,擴充套件介面為 MonitorFactoryMonitorMonitorService
  • protocol 遠端呼叫層:封裝 RPC 呼叫,以 InvocationResult 為中心,擴充套件介面為 ProtocolInvokerExporter
  • exchange 資訊交換層:封裝請求響應模式,同步轉非同步,以 RequestResponse 為中心,擴充套件介面為 ExchangerExchangeChannelExchangeClientExchangeServer
  • transport 網路傳輸層:抽象 mina 和 netty 為統一介面,以 Message 為中心,擴充套件介面為 ChannelTransporterClientServerCodec
  • serialize 資料序列化層:可複用的一些工具,擴充套件介面為 SerializationObjectInputObjectOutputThreadPool

 

(2)功能成熟度(部分可用於生產環節的功能,使用時注意版本是否支援)

Feature

Maturity

Strength

Problem

Advise

User

分組聚合

Tested

分組聚合返回值,用於選單聚合等服務

特殊場景使用

可用於生產環境

 

泛化引用

Stable

泛化呼叫,無需業務介面類進行遠端呼叫,用於測試平臺,開放閘道器橋接等

 

可用於生產環境

Alibaba

泛化實現

Stable

泛化實現,無需業務介面類實現任意介面,用於Mock平臺

 

可用於生產環境

Alibaba

隱式傳參

Stable

附加引數

 

可用於生產環境

 

本地存根

Stable

在客戶端執行部分邏輯

 

可用於生產環境

Alibaba

本地偽裝

Stable

偽造返回結果,可在失敗時執行,或直接執行,用於服務降級

需註冊中心支援

可用於生產環境

Alibaba

延遲暴露

Stable

延遲暴露服務,用於等待應用載入warmup資料,或等待spring載入完成

 

可用於生產環境

Alibaba


 (3)策略成熟度部分可用於生產環節的策略,使用時注意版本是否支援)

 協議:

Feature

Maturity

Strength

Problem

Advise

User

Dubbo協議

Stable

採用NIO複用單一長連線,並使用執行緒池併發處理請求,減少握手和加大併發效率,效能較好(推薦使用)

在大檔案傳輸時,單一連線會成為瓶頸

可用於生產環境

Alibaba

Rmi協議

Stable

可與原生RMI互操作,基於TCP協議

偶爾會連線失敗,需重建Stub

可用於生產環境

Alibaba

Hessian協議

Stable

可與原生Hessian互操作,基於HTTP協議

需hessian.jar支援,http短連線的開銷大

可用於生產環境

 

 

 序列化:

Feature

Maturity

Strength

Problem

Advise

User

Hessian Serialization

Stable

效能較好,多語言支援(推薦使用)

Hessian的各版本相容性不好,可能和應用使用的Hessian衝突,Dubbo內嵌了hessian3.2.1的原始碼

可用於生產環境

Alibaba

Java Serialization

Stable

Java原生支援

效能較差

可用於生產環境

 

 

叢集容錯:

Feature

Maturity

Strength

Problem

Advise

User

Failover Cluster

Stable

失敗自動切換,當出現失敗,重試其它伺服器,通常用於讀操作(推薦使用)

重試會帶來更長延遲

可用於生產環境

Alibaba

Failfast Cluster

Stable

快速失敗,只發起一次呼叫,失敗立即報錯,通常用於非冪等性的寫操作

如果有機器正在重啟,可能會出現呼叫失敗

可用於生產環境

Alibaba

Failsafe Cluster

Stable

失敗安全,出現異常時,直接忽略,通常用於寫入審計日誌等操作

呼叫資訊丟失

可用於生產環境

Monitor

Failback Cluster

Tested

失敗自動恢復,後臺記錄失敗請求,定時重發,通常用於訊息通知操作

不可靠,重啟丟失

可用於生產環境

Registry

Forking Cluster

Tested

並行呼叫多個伺服器,只要一個成功即返回,通常用於實時性要求較高的讀操作

需要浪費更多服務資源

可用於生產環境

 

Broadcast Cluster

Tested

廣播呼叫所有提供者,逐個呼叫,任意一臺報錯則報錯,通常用於更新提供方本地狀態

速度慢,任意一臺報錯則報錯

可用於生產環境

 

 

負載均衡

Feature

Maturity

Strength

Problem

Advise

User

Random LoadBalance

Stable

隨機,按權重設定隨機概率(推薦使用)

在一個截面上碰撞的概率高,重試時,可能出現瞬間壓力不均

可用於生產環境

Alibaba

RoundRobin LoadBalance

Stable

輪詢,按公約後的權重設定輪詢比率

存在慢的機器累積請求問題,極端情況可能產生雪崩

可用於生產環境

 

LeastActive LoadBalance

Stable

最少活躍呼叫數,相同活躍數的隨機,活躍數指呼叫前後計數差,使慢的機器收到更少請求

不支援權重,在容量規劃時,不能通過權重把壓力導向一臺機器壓測容量

可用於生產環境

 

ConsistentHash LoadBalance

Stable

一致性Hash,相同引數的請求總是發到同一提供者,當某一臺提供者掛時,原本發往該提供者的請求,基於虛擬節點,平攤到其它提供者,不會引起劇烈變動

壓力分攤不均

可用於生產環境

 

 

2.依賴關係

/dev-guide/images/dubbo-relation.jpg

圖例說明:

  • 圖中小方塊 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表層或模組,藍色的表示與業務有互動,綠色的表示只對 Dubbo 內部互動。
  • 圖中背景方塊 Consumer, Provider, Registry, Monitor 代表部署邏輯拓撲節點。
  • 圖中藍色虛線為初始化時呼叫,紅色虛線為執行時非同步呼叫,紅色實線為執行時同步呼叫。
  • 圖中只包含 RPC 的層,不包含 Remoting 的層,Remoting 整體都隱含在 Protocol 中。

3.呼叫鏈

 4.dubbo原始碼學習

原始碼學習,內容比較多,可以參考http://dubbo.apache.org/zh-cn/docs/user/quick-start.html 中的“原始碼導讀”部分,程式碼中加了很多註釋,講解很詳細,配合原始碼debug學習,效果更好。

 

參考:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

 

相關文章