Dubbo 原理和機制詳解 (非常全面)

2022-10-24 12:02:26

Dubbo原理和機制詳解(非常全面)-mikechen的網際網路架構

Dubbo 是一款Java RPC框架,致力於提供高效能的 RPC 遠端服務呼叫方案。作為主流的微服務架構之一,Dubbo 為開發人員帶來了非常多的便利。

大家好,我是 mikechen,專注分享「網際網路大廠架構技術」~

本文,我重點詳解 Dubbo 的原理機制 @mikechen

目錄

Dubbo核心功能

Dubbo主要提供了3大核心功能:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。

 1)遠端方法呼叫

網路通訊框架,提供對多種NIO框架抽象封裝,包括「同步轉非同步」和「請求-響應」模式的資訊交換方式。

 2)智慧容錯和負載均衡

提供基於介面方法的透明遠端過程呼叫,包括多協定支援,以及軟負載均衡,失敗容錯,地址路由,動態設定等叢集支援。

3)服務註冊和發現

服務註冊,基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。

 

Dubbo核心元件

Dubbo角色,主要包含如下幾個核心元件:

Dubbo原理和機制詳解(非常全面)-mikechen的網際網路架構

1)註冊中心(registry)

生產者在此註冊並行布內容,消費者在此訂閱並接收發布的內容。

2)消費者(consumer)

使用者端,從註冊中心獲取到方法,可以呼叫生產者中的方法。

3)生產者(provider)

伺服器端,生產內容,生產前需要依賴容器(先啟動容器)。

4)容器(container)

生產者在啟動執行的時候,必須依賴容器才能正常啟動(預設依賴的是spring容器),

5)監控(Monitor)

統計服務的呼叫次數與時間等。

 

Dubbo的架構設計

Dubbo整體架構如下圖所示:

Dubbo原理和機制詳解(非常全面)-mikechen的網際網路架構

圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面, 位於中軸線上的為雙方都用到的介面。

Dubbo框架設計一共劃分了10個層:

1. 服務介面層(Service)

該層是與實際業務邏輯相關的,根據服務提供方和服務消費方的業務設計對應的介面和實現。

2. 設定層(Config)

對外設定介面,以ServiceConfig和ReferenceConfig為中心,可以直接new設定類,也可以通過spring解析設定生成設定類。

 3.服務代理層(Proxy)

服務介面透明代理,生成服務的使用者端Stub和伺服器端Skeleton,以ServiceProxy為中心,擴充套件介面為ProxyFactory。

 4.服務註冊層(Registry)

封裝服務地址的註冊與發現,以服務URL為中心,擴充套件介面為RegistryFactory、Registry和RegistryService。可能沒有服務註冊中心,此時服務提供方直接暴露服務。

 5.叢集層(Cluster)

封裝多個提供者的路由及負載均衡,並橋接註冊中心,以Invoker為中心,擴充套件介面為Cluster、Directory、Router和LoadBalance。將多個服務提供方組合為一個服務提供方,實現對服務消費方來透明,只需要與一個服務提供方進行互動。

 6.監控層(Monitor)

RPC呼叫次數和呼叫時間監控,以Statistics為中心,擴充套件介面為MonitorFactory、Monitor和MonitorService。

 7.遠端呼叫層(Protocol)

封將RPC呼叫,以Invocation和Result為中心,擴充套件介面為Protocol、Invoker和Exporter。Protocol是服務域,它是Invoker暴露和參照的主功能入口,它負責Invoker的生命週期管理。Invoker是實體域,它是Dubbo的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起invoke呼叫,它有可能是一個原生的實現,也可能是一個遠端的實現,也可能一個叢集實現。

8. 資訊交換層(Exchange)

封裝請求響應模式,同步轉非同步,以Request和Response為中心,擴充套件介面為Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer。

 9.網路傳輸層(Transport)

抽象mina和netty為統一介面,以Message為中心,擴充套件介面為Channel、Transporter、Client、Server和Codec。

10.資料序列化層(Serialize)

可複用的一些工具,擴充套件介面為Serialization、 ObjectInput、ObjectOutput和ThreadPool。

 

Dubbo呼叫流程

Dubbo原理和機制詳解(非常全面)-mikechen的網際網路架構

對照上面的整體架構圖,大致分為以下8大步驟:

1、服務提供者啟動,開啟Netty服務,建立Zookeeper使用者端,向註冊中心註冊服務;

2、服務消費者啟動,通過Zookeeper向註冊中心獲取服務提供者列表,與服務提供者通過Netty建立長連線;

3、服務消費者通過介面開始遠端呼叫服務,ProxyFactory通過初始化Proxy物件,Proxy通過建立動態代理物件;

4、動態代理物件通過invoke方法,層層包裝生成一個Invoker物件,該物件包含了代理物件;

5、Invoker通過路由,負載均衡選擇了一個最合適的服務提供者,在通過加入各種過濾器,協定層包裝生成一個新的DubboInvoker物件;

6、再通過交換成將DubboInvoker物件包裝成一個Reuqest物件,該物件通過序列化通過NettyClient傳輸到服務提供者的NettyServer端;

7、到了服務提供者這邊,再通過反序列化、協定解密等操作生成一個DubboExporter物件,再層層傳遞處理,會生成一個服務提供端的Invoker物件;

8、這個Invoker物件會呼叫本地服務,獲得結果再通過層層回撥返回到服務消費者,服務消費者拿到結果後,再解析獲得最終結果。

 

以上,是關於 Dubbo 原理機制及架構設計等的詳細解析。

本文對理解、掌握和使用 Dubbo 有所幫助,可以作為 Dubbo 的參考學習資料,建議收藏、時常溫顧。

如果覺得有用,請點選【 推薦 】支援下,謝謝~

 

作者簡介

陳睿 | mikechen , 10年+大廠架構經驗,「mikechen 的網際網路架構」系列文章作者,專注網際網路架構技術。

閱讀「mikechen 的網際網路架構」的更多技術文章合集: 

Java並行 | JVM | MySQL | Spring | Redis | 分散式 | 高並行