Dubbo架構(gòu)整體設(shè)計詳解
一、Dubbo調(diào)用關(guān)系說明

1.1 組成部分
在這里主要由四部分組成:
● Provider: 暴露服務(wù)的服務(wù)提供方
Protocol:負責提供者和消費者之間的協(xié)議交互數(shù)據(jù)
Service:真實的業(yè)務(wù)服務(wù)信息,可以理解成接口和實現(xiàn)
Container:Dubbo的運行環(huán)境
● Consumer:調(diào)用遠程服務(wù)的服務(wù)消費方
Protocol:負責提供者和消費者之間的協(xié)議交互數(shù)據(jù)
Cluster:感知提供者端的列表信息
Proxy:可以理解成提供者的服務(wù)調(diào)用代理,由它接管Consumer中的接口調(diào)用邏輯
● Register:注冊中心,用于作為服務(wù)發(fā)現(xiàn)和路由配置等工作,提供者和消費者都會在這里進行注冊
● Monitor:用于提供者和消費者中的數(shù)據(jù)統(tǒng)計,比如調(diào)用頻次、成功失敗次數(shù)等信息
1.2 啟動和執(zhí)行流程說明
● 提供者端啟動,容器負責把Service信息加載,并通過Protocol注冊到注冊中心;
● 消費者端啟動,通過監(jiān)聽提供者列表來感知提供者信息,并在提供者發(fā)生改變時,通過 注冊中心及時通知消費端
● 消費方通過Proxy模塊發(fā)起請求;
● 消費者端利用Cluster模塊選擇真實的要調(diào)用的提供者;
● 消費者利用Consumer中的Protocol將信息發(fā)送給提供者;
● 提供者通過Protocol模塊來處理消費者信息;
● 最后由提供者的Service來進行處理
二、整體調(diào)用鏈路

說明:淡綠色代表服務(wù)生產(chǎn)者的范圍,淡藍色代表服務(wù)消費者的范圍,紅色箭頭代表調(diào)用的方向:業(yè)務(wù)邏輯層 -> RPC層(遠程過程調(diào)用)-> Remoting(遠程數(shù)據(jù)傳輸)
整體調(diào)用流程如下:
● 消費者通過Interface進行方法調(diào)用,統(tǒng)一交由消費者端的Proxy,通過ProxyFactory來進行代理對象的創(chuàng)建,這里使用jdk的javassist技術(shù)
● 交給Filter模塊做統(tǒng)一的過濾請求
● 接下來就是最主要的Invoker調(diào)用邏輯了
○ 通過Directory去配置中讀取信息,最終通過list方法獲取所有的Invoker
○ 通過Cluster模塊,根據(jù)選擇的具體路由規(guī)則來選取Invoker列表
○ 通過LoadBalance模塊,根據(jù)負載均衡策略選擇一個具體的Invoker來處理請求
○ 如果執(zhí)行中出現(xiàn)錯誤,并且Consumer階段配置了重試機制,則會重新嘗試執(zhí)行
● 繼續(xù)經(jīng)過Filter進行執(zhí)行功能的前后封裝,Invoker選擇具體的執(zhí)行協(xié)議
● 客戶端進行編碼和序列化,然后發(fā)送數(shù)據(jù)
● 達到Provider中的Server層進行反編碼和發(fā)序列化接收到的數(shù)據(jù)
● 使用Exporter選擇執(zhí)行器
● 交由Filter進行一個提供者端的過濾,到達Invoker執(zhí)行器
● 通過Invoker調(diào)用接口的具體實現(xiàn),然后返回結(jié)果
三、Dubbo整體設(shè)計

圖例說明:
● 圖中左邊淡藍背景的為服務(wù)消費方使用的接口,右邊淡綠色背景的為服務(wù)提供方使用的接口,位于中軸線上的為雙方都用到的接口。
● 圖中從上往下分為十層,各層為單向依賴,右邊的黑色箭頭代表層之間的依賴關(guān)系,每一層都可以剝離上層被復(fù)用,其中Service和Config層為API,其他各層均為SPI
● 圖中綠色的小塊為擴展接口,藍色小塊為實現(xiàn)類,圖中只顯示用于關(guān)聯(lián)各層的實現(xiàn)類
● 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調(diào)用過程,即運行時調(diào)用鏈,紫色箭頭為繼承,可以把子類看做父類的同一個節(jié)點,線上的文字為調(diào)用的方法。
Dubbo源碼整體設(shè)計與調(diào)用鏈路十分相似。只不過這里可以看到接口的一些具體實現(xiàn)以及左側(cè)也有更為詳細的層次劃分,我們在后面的源碼解析時也會著重介紹其中比較重要的模塊實現(xiàn)。
接下來分層進行介紹
1、Business業(yè)務(wù)邏輯層
● Service業(yè)務(wù)層:包括業(yè)務(wù)代碼比如接口和實現(xiàn)類
2、RPC層:遠程過程調(diào)用層
● config配置層,對外提供配置,以ServiceConfig、ReferenceConfig為核心,可以直接初始化配置類,也可解析配置文件
● Proxy服務(wù)代理層,無論是生產(chǎn)者還是消費者,框架都會產(chǎn)生一個代理類,整個過程對上層透明,業(yè)務(wù)層對遠程調(diào)用無感
● Register注冊中心層,封裝服務(wù)地址的注冊與發(fā)現(xiàn),以服務(wù)的URL位中心
● Cluster路由層(集群容錯層),提供了多個提供者的路由和負載均衡,并且它橋接注冊中心以Invoker為中心
● Monitor監(jiān)控層,RPC調(diào)用相關(guān)的信息,如調(diào)用次數(shù)、失敗情況、調(diào)用時間等統(tǒng)計信息都會在這一層完成統(tǒng)計
● Protocol遠程調(diào)用層,封裝RPC調(diào)用,無論是服務(wù)的暴露還是服務(wù)的引用,都是在Protocol中作為主功能入口負責Invoker的整個生命周期,Dubbo中的所有模型都向Invoker靠攏
3、Rmoting層:遠程數(shù)據(jù)傳輸層
● Exchange信息交換層,封裝請求和響應(yīng)的模式,把請求由同步轉(zhuǎn)為異步
● Transport網(wǎng)絡(luò)傳輸層,統(tǒng)一網(wǎng)絡(luò)傳輸?shù)慕涌冢热鏝etty和mina統(tǒng)一為一個網(wǎng)絡(luò)傳輸接口
● Serialize數(shù)據(jù)序列化層,負責管理整個框架中的數(shù)據(jù)傳輸?shù)男蛄谢头葱蛄谢?/p>
到此這篇關(guān)于Dubbo架構(gòu)整體設(shè)計詳解的文章就介紹到這了,更多相關(guān)Dubbo架構(gòu)設(shè)計內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java環(huán)境變量path和classpath的配置
這篇文章主要為大家詳細介紹了java系統(tǒng)環(huán)境變量path和classpath的配置過程,感興趣的小伙伴們可以參考一下2016-07-07
Nacos設(shè)置為windows自啟動服務(wù)的步驟詳解
這篇文章給大家介紹了Nacos設(shè)置為windows自啟動服務(wù)的操作步驟,文中通過代碼示例和圖文結(jié)合講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-12-12
一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法
這篇文章主要介紹了一鍵清除maven倉庫中下載失敗的jar包的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
IDEA?+?Maven環(huán)境下的SSM框架整合及搭建過程
這篇文章主要介紹了IDEA?+?Maven環(huán)境下的SSM框架整合及搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
在Ubuntu上部署SpringBoot應(yīng)用的操作步驟
隨著云計算和容器化技術(shù)的普及,Linux 服務(wù)器已成為部署 Web 應(yīng)用程序的主流平臺之一,Java 作為一種跨平臺的編程語言,具有廣泛的應(yīng)用場景,本文將詳細介紹如何在 Ubuntu 服務(wù)器上部署 Java 應(yīng)用,需要的朋友可以參考下2025-01-01

