1.整體設計
(1)架構圖
圖例說明:
- 圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面,位於中軸線上的為雙方都用到的介面。
- 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關係,每一層都可以剝離上層被複用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
- 圖中綠色小塊的為擴充套件介面,藍色小塊為實現類,圖中只顯示用於關聯各層的實現類。
- 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法呼叫過程,即執行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為呼叫的方法。
各層說明:
- config 配置層:對外配置介面,以
ServiceConfig
,ReferenceConfig
為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類 - proxy 服務代理層:服務介面透明代理,生成服務的客戶端 Stub 和伺服器端 Skeleton, 以
ServiceProxy
為中心,擴充套件介面為ProxyFactory
- registry 註冊中心層:封裝服務地址的註冊與發現,以服務 URL 為中心,擴充套件介面為
RegistryFactory
,Registry
,RegistryService
- cluster 路由層:封裝多個提供者的路由及負載均衡,並橋接註冊中心,以
Invoker
為中心,擴充套件介面為Cluster
,Directory
,Router
,LoadBalance
- monitor 監控層:RPC 呼叫次數和呼叫時間監控,以
Statistics
為中心,擴充套件介面為MonitorFactory
,Monitor
,MonitorService
- protocol 遠端呼叫層:封裝 RPC 呼叫,以
Invocation
,Result
為中心,擴充套件介面為Protocol
,Invoker
,Exporter
- exchange 資訊交換層:封裝請求響應模式,同步轉非同步,以
Request
,Response
為中心,擴充套件介面為Exchanger
,ExchangeChannel
,ExchangeClient
,ExchangeServer
- transport 網路傳輸層:抽象 mina 和 netty 為統一介面,以
Message
為中心,擴充套件介面為Channel
,Transporter
,Client
,Server
,Codec
- serialize 資料序列化層:可複用的一些工具,擴充套件介面為
Serialization
,ObjectInput
,ObjectOutput
,ThreadPool
(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.依賴關係
圖例說明:
- 圖中小方塊 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