dubbo---1總體
1 框架設計
官網:http://dubbo.apache.org/zh/docs/v2.7/dev/design/
- 圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面,位於中軸線上的為雙方都用到的介面。
- 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關係,每一層都可以剝離上層被複用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
- 圖中綠色小塊的為擴充套件介面,藍色小塊為實現類,圖中只顯示用於關聯各層的實現類。
- 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法呼叫過程,即執行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為呼叫的方法。
1.1各層說明
- config 配置層:對外配置介面,以
ServiceConfig
,ReferenceConfig
為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類 - proxy 服務代理層:服務介面透明代理,生成服務的客戶端 Stub 和伺服器端 Skeleton, 以
ServiceProxy
為中心,擴充套件介面為ProxyFactory
- registry 註冊中心層:封裝服務地址的註冊與發現,以服務 URL 為中心,擴充套件介面為
RegistryFactory
,Registry
,RegistryService
- cluster 路由層:封裝多個提供者的路由及負載均衡,並橋接註冊中心,以
Invoker
為中心,擴充套件介面為Cluster
,Directory
,Router
,LoadBalance
- monitor 監控層:RPC 呼叫次數和呼叫時間監控,以
Statistics
為中心,擴充套件介面為MonitorFactory
,Monitor
,MonitorService
- protocol 遠端呼叫層:封裝 RPC 呼叫,以
Invocation
,Result
為中心,擴充套件介面為Protocol
,Invoker
,Exporter
- exchange 資訊交換層:封裝請求響應模式,同步轉非同步,以
Request
,Response
為中心,擴充套件介面為Exchanger
,ExchangeChannel
,ExchangeClient
,ExchangeServer
- transport 網路傳輸層:抽象 mina 和 netty 為統一介面,以
Message
為中心,擴充套件介面為Channel
,Transporter
,Client
,Server
,Codec
- serialize 資料序列化層:可複用的一些工具,擴充套件介面為
Serialization
,ObjectInput
,ObjectOutput
,ThreadPool
1.2關係說明
- 在 RPC 中,Protocol 是核心層,也就是隻要有 Protocol + Invoker + Exporter 就可以完成非透明的 RPC 呼叫,然後在 Invoker 的主過程上 Filter 攔截點。
- 圖中的 Consumer 和 Provider 是抽象概念,只是想讓看圖者更直觀的瞭解哪些類分屬於客戶端與伺服器端,不用 Client 和 Server 的原因是 Dubbo 在很多場景下都使用 Provider, Consumer, Registry, Monitor 劃分邏輯拓普節點,保持統一概念。
- 而 Cluster 是外圍概念,所以 Cluster 的目的是將多個 Invoker 偽裝成一個 Invoker,這樣其它人只要關注 Protocol 層 Invoker 即可,加上 Cluster 或者去掉 Cluster 對其它層都不會造成影響,因為只有一個提供者時,是不需要 Cluster 的。
- Proxy 層封裝了所有介面的透明化代理,而在其它層都以 Invoker 為中心,只有到了暴露給使用者使用時,才用 Proxy 將 Invoker 轉成介面,或將介面實現轉成 Invoker,也就是去掉 Proxy 層 RPC 是可以 Run 的,只是不那麼透明,不那麼看起來像調本地服務一樣調遠端服務。
- 而 Remoting 實現是 Dubbo 協議的實現,如果你選擇 RMI 協議,整個 Remoting 都不會用上,Remoting 內部再劃為 Transport 傳輸層和 Exchange 資訊交換層,Transport 層只負責單向訊息傳輸,是對 Mina, Netty, Grizzly 的抽象,它也可以擴充套件 UDP 傳輸,而 Exchange 層是在傳輸層之上封裝了 Request-Response 語義。
- Registry 和 Monitor 實際上不算一層,而是一個獨立的節點,只是為了全域性概覽,用層的方式畫在一起。
1.3模組分包
模組說明:
- dubbo-common 公共邏輯模組:包括 Util 類和通用模型。
- dubbo-remoting 遠端通訊模組:相當於 Dubbo 協議的實現,如果 RPC 用 RMI協議則不需要使用此包。
- dubbo-rpc 遠端呼叫模組:抽象各種(序列化)協議,以及動態代理,只包含一對一的呼叫,不關心叢集的管理。
- dubbo-cluster 叢集模組:將多個服務提供方偽裝為一個提供方,包括:負載均衡, 容錯,路由等,叢集的地址列表可以是靜態配置的,也可以是由註冊中心下發。
- dubbo-registry 註冊中心模組:基於註冊中心下發地址的叢集方式,以及對各種註冊中心的抽象。
- dubbo-monitor 監控模組:統計服務呼叫次數,呼叫時間的,呼叫鏈跟蹤的服務。
- dubbo-config 配置模組:是 Dubbo 對外的 API,使用者通過 Config 使用Dubbo,隱藏 Dubbo 所有細節。
- dubbo-container 容器模組:是一個 Standlone 的容器,以簡單的 Main 載入 Spring 啟動,因為服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去載入服務。
整體上按照分層結構進行分包,與分層的不同點在於:
- container 為服務容器,用於部署執行服務,沒有在層中畫出。
- protocol 層和 proxy 層都放在 rpc 模組中,這兩層是 rpc 的核心,在不需要叢集也就是隻有一個提供者時,可以只使用這兩層完成 rpc 呼叫。
- transport 層和 exchange 層都放在 remoting 模組中,為 rpc 呼叫的通訊基礎。
- serialize 層放在 common 模組中,以便更大程度複用。
1.4 依賴關係
圖例說明:
- 圖中小方塊 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表層或模組,藍色的表示與業務有互動,綠色的表示只對 Dubbo 內部互動。
- 圖中背景方塊 Consumer, Provider, Registry, Monitor 代表部署邏輯拓撲節點。
- 圖中藍色虛線為初始化時呼叫,紅色虛線為執行時非同步呼叫,紅色實線為執行時同步呼叫。
- 圖中只包含 RPC 的層,不包含 Remoting 的層,Remoting 整體都隱含在 Protocol 中。
1.5 呼叫鏈
展開總設計圖的紅色呼叫鏈,如下:
1.6 暴露服務時序
展開總設計圖左邊服務提供方暴露服務的藍色初始化鏈,時序圖如下:
1.7 引用服務時序
展開總設計圖右邊服務消費方引用服務的藍色初始化鏈,時序圖如下:
1.8領域模型
在 Dubbo 的核心領域模型中:
- Protocol 是服務域,它是 Invoker 暴露和引用的主功能入口,它負責 Invoker 的生命週期管理。
- Invoker 是實體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉換成它,它代表一個可執行體,可向它發起 invoke 呼叫,它有可能是一個本地的實現,也可能是一個遠端的實現,也可能一個叢集實現。
- **Invocation 是會話域,**它持有呼叫過程中的變數,比如方法名,引數等。
1.9基本設計原則
- 採用 Microkernel + Plugin 模式,Microkernel 只負責組裝 Plugin,Dubbo 自身的功能也是通過擴充套件點實現的,也就是 Dubbo 的所有功能點都可被使用者自定義擴充套件所替換。
- 採用 URL 作為配置資訊的統一格式,所有擴充套件點都通過傳遞 URL 攜帶配置資訊。
2 設計原則
本章節的設計原則摘錄自樑飛在 javaeye 上發表的系列文章。
3 dubbo入口
也是擴充套件點,dubbo自帶的一種實現
相關文章
- 體系總結
- 總體設計(軟體專案)
- Python總體架構Python架構
- IFC總體架構架構
- P0 總體
- 軟體工程總結軟體工程
- 軟體面試體總結待完善面試
- 光度立體法總結
- MySQL中介軟體總結MySql
- 裝機軟體彙總
- webpack整體配置總結Web
- Tomcat總體架構(一)Tomcat架構
- JVM系列(一) - JVM總體概述JVM
- 軟體測試方法彙總
- 微服務總體功能模組微服務
- JVM記憶體模型總結JVM記憶體模型
- Java 集合框架體系總覽Java框架
- 《三體2:黑暗森林》總結
- 《三體3:死神永生》總結
- 資料分析整體總結
- 驅動總裁是流氓軟體嗎 驅動總裁有捆綁軟體嗎
- 架構知識體系總結架構
- 《智慧養老》總體設計方案
- 《軟體專案經驗總結》
- Node基礎之總體概覽
- Android技能樹 — Fragment總體小結AndroidFragment
- JVM記憶體管理——總結篇JVM記憶體
- Java 集合(1)之 總體架構Java架構
- XXE外部實體注入漏洞總結
- 國家體育總局:2017年全國體育產業總規模達2.2萬億元產業
- 從單體到微服務,軟體架構演化總覽微服務架構
- 評分卡模型開發--總體流程模型
- 登入介面設計之一:總體
- JVM之記憶體區域總結JVM記憶體
- Mysql中介軟體 oneProxy的使用總結MySql
- 決策樹模型(1)總體介紹模型
- 中介軟體漏洞攻防學習總結
- EOS系統合約總體介紹