在這裡主要由四部分組成:
● Provider: 暴露服務的服務提供者
Protocol:負責提供者與消費者之間的協定互動資料
Service:真實的業務服務信息,可以理解成接口和實現
Container:Dubbo的運行環境
● Consumer:調用遠程服務的服務消費方
Protocol:負責提供者和消費者之間的協議交互數據
Cluster:感知提供者端的清單資訊
Proxy:可以理解成提供者的服務呼叫代理,由它接管Consumer中的介面呼叫邏輯
● Register:註冊中心,用於作為服務發現和路由配置等工作,提供者和消費者都會在這裡進行註冊
● Monitor:用於提供者和消費者中的資料統計,例如呼叫頻次、成功失敗次數等資訊
● 提供者端啟動,容器負責把Service資訊加載,並透過Protocol註冊到註冊中心;
● 消費者端啟動,透過監聽提供者列表來感知提供者信息,並在提供者改變時,透過註冊中心及時通知消費端
● 消費方透過Proxy模組發起請求;
● 消費者端利用Cluster模組選擇真實的要呼叫的提供者;
● 消費者利用Consumer中的Protocol將資訊傳送給提供者;
● 提供者透過Protocol模組來處理消費者資訊;
● 最後由提供者的Service來進行處理
說明:淡綠色代表服務生產者的範圍,淡藍色代表服務消費者的範圍,紅色箭頭代表呼叫的方向:業務邏輯層-> ; RPC層(遠端過程調用)-> Remoting(遠端資料傳輸)
整體調用流程如下:
● 消費者透過Interface進行方法調用,統一交由消費者端的Proxy,透過ProxyFactory來進行代理物件的創建,這裡使用jdk的javassist技術
● 交給Filter模組做統一的過濾請求
● 接下來就是最主要的Invoker調用邏輯了
○ 透過Directory去配置中讀取訊息,最終透過list方法取得所有的Invoker
○ 透過Cluster模組,根據所選的具體路由規則來選取Invoker清單
○ 透過LoadBalance模組,根據負載平衡策略選擇一個具體的Invoker來處理請求
○ 如果執行中出現錯誤,並且Consumer階段配置了重試機制,則會重新嘗試執行
● 繼續經過Filter進行執行功能的前後封裝,Invoker選擇具體的執行協定
● 客戶端進行編碼和序列化,然後發送資料
● 達到Provider中的Server層進行反編碼和發序列化接收到的資料
● 使用Exporter選擇執行器
● 交由Filter進行一個提供者端的過濾,到達Invoker執行器
● 透過Invoker呼叫介面的具體實現,然後傳回結果
#圖例說明:
● 圖中左邊淡藍背景的為服務消費方使用的接口,右邊淡綠色背景的為服務提供方使用的接口,位於中軸線上的為雙方都用到的介面。
● 圖中從上往下分為十層,各層為單向依賴,右邊的黑色箭頭代表層之間的依賴關係,每一層都可以剝離上層被復用,其中Service和Config層為API,其他各層均為SPI
● 圖中綠色的小塊為擴展接口,藍色小塊為實現類,圖中只顯示用於關聯各層的實現類
● 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調用過程,即運行時調用鏈,紫色箭頭為繼承,可以把子類看做父類的同一個節點,線上的文字為調用的方法。
Dubbo原始碼整體設計與呼叫連結十分相似。只不過這裡可以看到介面的一些具體實作以及左側也有更為詳細的層次劃分,我們在後面的源碼解析時也會著重介紹其中比較重要的模組實作。
接下來分層進行介紹
1、Business業務邏輯層
● Service業務層:包括業務代碼例如介面和實作類別
2、RPC層:遠端過程呼叫層
● config配置層,對外提供配置,以ServiceConfig、ReferenceConfig為核心,可以直接初始化配置類,也可解析設定檔
● Proxy服務代理層,無論是生產者或消費者,框架都會產生一個代理類,整個過程對上層透明,業務層對遠端呼叫無感
● Register註冊中心層,封裝服務位址的註冊與發現,以服務的URL位元中心
● Cluster路由層(叢集容錯層),提供了多個提供者的路由與負載均衡,並且它橋接註冊中心以Invoker為中心
● Monitor監控層,RPC調用相關的信息,如調用次數、失敗情況、調用時間等統計信息都會在這一層完成統計
● Protocol遠程調用層,封裝RPC調用,無論是服務的暴露還是服務的引用,都是在Protocol中作為主功能入口負責Invoker的整個生命週期,Dubbo中的所有模型都向Invoker靠攏
3、Rmoting層:遠端資料傳輸層
● Exchange訊息交換層,封裝請求和回應的模式,把請求由同步轉為非同步
● Transport網路傳輸層,統一網路傳輸的接口,例如Netty和mina統一為一個網絡傳輸介面
● Serialize資料序列化層,負責管理整個框架中的資料傳輸的序列化和反序列化
以上是java Dubbo架構整體設計方法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!