一.簡介

在編寫分佈式場景下高併發、高擴展的系統對技能的要求很高,因爲這個過程會涉及到序列化 / 反序列化、多線程、網絡編程、設計模式、性能優化等衆多專業知識。而 Dubbo 框架對這些專業知識做了更高層的抽象和封裝,提供了開箱即用的特性。所以換句話說 Dubbo 是爲了解決大流量、高併發場景下提供高可用、提升系統性能的這樣一個服務治理方案,也是優秀的 RPC 框架之一,因此被衆多公司採用並根據自己的業務實現擴展。

Dubbo 提供了註冊中心機制,解耦了服務方和消費方動態發現的問題,並提供了高可靠能力,大量採用微內核 + 富插件設計思想,包括框架自身核心特性都作爲擴展點實現,提供了靈活的擴展點能力。

二.架構

1. 服務提供者 Provider 啓動時會向註冊中心把自己的元數據註冊上去(比如服務 IP 、端口及需要註冊的接口定義等信息);

2. 服務消費方 Consumer 在啓動時會從註冊中心訂閱(第一次訂閱會拉取全量數據)服務提供方的元數據;

3. 而當註冊中心數據發生變更時會推送給訂閱的 Consumer (比如 Provider 某個節點 Down 掉了,又或者服務提供方進行了擴容,增加了節點。);

4. Consumer 獲取到元數據後, Consumer 可以發起 RPC 調用(本質其實是 Socket 通信 + 動態代理這樣的一個實現機制);

5.RPC 調用前後會向監控中心上報統計信息(比如併發數和調用接口)。

Dubbo 總體分爲業務層( Biz )、 RPC 層、 Remote 三層。如果把每一層繼續細化,那一共可以分爲 10 層。可以參考下圖,圖中左邊是具體的分層,右邊是該層中比較重要的接口:

其中 Service Config 兩層可以認爲是 API 層,主要提供給 API 使用者,使用者無需關係底層的實現,只需要配置和完成業務代碼即可;後面所有層級合在一起,可以認爲是 SPI 層,主要提供給擴展者使用,即用戶可以基於 Dubbo 框架做定製性的二次開發,擴展其功能。

Dubbo 核心組件:

1.Service

業務層。包括業務代碼接口與實現,即我們自己實現的業務代碼。

2.config

配置層。主要圍繞 ServiceConfig (暴露的服務配置)和 ReferenceConfig (引用的服務配置)兩個實現類展開,初始化配置信息。可以理解爲該層管理整個 Dubbo 配置。

3.proxy

服務代理層。在 Dubbo 中,無論生產者還是消費者,框架都會生成一個代理類,整個過程對上層是透明的。當調用一個遠程接口時,看起來就像調用本地接口一樣,代理層會自動做遠程調用並返回結果,即讓業務層對遠程調用完全無感。

4.registry

註冊層。服務 Dubbo 框架的服務註冊與發現。當所有新的服務加入或者就服務下線時,註冊中心都會感知並通知訂閱方。整個過程不需要人工參與。

5.cluster

集羣容錯層。主要負責遠程調用失敗時的容錯策略(如失敗重試、快速失敗);選擇具體調用節點時的複雜均衡策略(如隨機、一致性 Hash 等);特殊調用路徑的路由策略(如某個 Consumer 只會調用某個 IP Provider )。

6.monitor

監控層。複雜監控統計調用次數和調用時間等。

7.protocol

遠程調用層。封裝 RPC 調用的具體過程, Protocol Invoker 暴露(發佈一個新功能讓別人調用)和引用(引用一個遠程服務到本地)的主功能入口。它負責管理 Invoker 的整個生命週期。 Invoker Dubbo 核心模型,框架中所有其他模型都向它靠攏,或者轉換成它,它代表一個可執行體。

8.exchange

信息交換層。建立 Request-Response 模型,封裝請求響應模式,如吧同步請求轉化爲一步請求。

9.transport

網絡傳輸層。把網絡傳輸抽象爲同一的接口,如 Mina Netty 雖然接口不一樣,但是 Dubbo 在他們上面又封裝了統一的接口。我們也可以根據其擴展接口添加更多的網絡傳輸方式。

10.Serialize

序列化層。如果數據要通過網絡進行發送,則需要先做做序列化,變成二進制流。序列化層負責管理整個框架網絡傳輸時的序列化 / 反序列化工作。

三.特性及解決問題

特性:

1. 面向接口代理的改性能 RPC 調用

提供了高性能的基於代理的遠程調用能力,服務以接口爲粒度,爲開發者屏蔽調用的遠程細節。

2. 服務自動註冊與發現

支持多種註冊中心服務,服務實例上下線實時感知(上圖中的第 3 步)。

3. 運行期流量調度

內置條件、腳本等路由策略,通過配置不同的路由規則,輕鬆實現灰度發佈、同機房優先等功能。

4. 智能負載均衡

內置多種負載均衡策略,智能感知下游節點健康狀況,顯著減少調用延遲,提高系統吞吐量。

5. 高度可擴展能力

遵循微內核 + 插件的設計思想,所有核心能力如 Protocol Transport Serialization 被設計爲擴展點,平等對待內置實現和第三方實現。( Dubbo SPI 擴展點機制)

6. 可視化的服務治理與運維

提供了豐富服務治理、運維工具( Dubbo Admin ):隨時查詢服務元數據、服務簡況狀態及調用統計,實時下發路由策略、調整配置參數。

解決問題:

1 ) 高性能、透明的 RPC 調用。只要涉及服務之間的通信, RPC 就必不可。 Dubbo 可以讓我們像調用本地服務一樣簡單的去調用遠程服務,而不需要再代碼中顯示的指定遠程調用。整個過程對上層開發者透明, Dubbo 會自動完成後續的所有操作,例如:負載均衡、路由、協議轉換、序列化等。開發者只需要接收對應的調用結果。

2 )服務的自動註冊與發現。當服務越來越多時,服務 URL 配置管理變得非常困難,服務的註冊與發現已經不可能由人工來管理。此時需要一個註冊中心,動態的註冊和發現服務,使服務的位置透明。 Dubbo 適配了多種註冊中心。

3 )自動負載與容錯。 當服務越來越多時, F5 一年負載均衡器的單點壓力也原來越大, Dubbo 提供了完整的集羣容錯機制,可以實現軟件層面的負載均衡,依次降低硬件的壓力。 Dubbo 還提供了調用失敗的各種容錯機制,如 Failover Failfast 、結果集合並等。

4 )動態的流量調度。在應用運行時,某些服務節點可能因爲硬件原因需要減少負載或者某些節點需要人工手動下線;又或者需要實現單元化的調用、灰度功能。通過 Dubbo Admin 管理控制檯,用戶可以在界面上動態地調整每個服務的權重、路由規則、禁用 / 啓用,實現運行時的流量調度。

5 )依賴分析和調用統計

Dubbo 可以介入第三方的 APM 做分佈式鏈路追蹤與性能分析,或者使用已有的獨立監控中心的調用次數及耗時,我們可以通過這些數據反推系統容量,在合適的時候通過加機器進行擴容,並且可以預估需要添加多少臺機器。

相關文章