Dubbo 是一款Java RPC框架,致力於提供高效能的 RPC 遠端服務呼叫方案。作為主流的微服務架構之一,Dubbo 為開發人員帶來了非常多的便利。
大家好,我是 mikechen,專注分享「網際網路大廠架構技術」~
本文,我重點詳解 Dubbo 的原理機制 @mikechen
Dubbo主要提供了3大核心功能:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
1)遠端方法呼叫
網路通訊框架,提供對多種NIO框架抽象封裝,包括「同步轉非同步」和「請求-響應」模式的資訊交換方式。
2)智慧容錯和負載均衡
提供基於介面方法的透明遠端過程呼叫,包括多協定支援,以及軟負載均衡,失敗容錯,地址路由,動態設定等叢集支援。
3)服務註冊和發現
服務註冊,基於註冊中心目錄服務,使服務消費方能動態的查詢服務提供方,使地址透明,使服務提供方可以平滑增加或減少機器。
Dubbo角色,主要包含如下幾個核心元件:
1)註冊中心(registry)
生產者在此註冊並行布內容,消費者在此訂閱並接收發布的內容。
2)消費者(consumer)
使用者端,從註冊中心獲取到方法,可以呼叫生產者中的方法。
3)生產者(provider)
伺服器端,生產內容,生產前需要依賴容器(先啟動容器)。
4)容器(container)
生產者在啟動執行的時候,必須依賴容器才能正常啟動(預設依賴的是spring容器),
5)監控(Monitor)
統計服務的呼叫次數與時間等。
Dubbo整體架構如下圖所示:
圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面, 位於中軸線上的為雙方都用到的介面。
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。
對照上面的整體架構圖,大致分為以下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 | 分散式 | 高並行