本文主要說明點
- 概述
- 背景
- 需求
- 架構
- Dubbo源代碼項目結構
概述
分享 Dubbo 的項目結構 ,通過本文可以大致了解到Dubbo整個項目的結構
背景
將一個項目進行拆分, 進行分布式架構。
需要解決下面的問題
-
單一應用架構
- 網站流量少時單一架構,簡化開發。此時,用於簡化增刪改查工作量的數據訪問框架(ORM)是關鍵。
-
垂直應用架構
- 訪問大時單一應用速度過小,需要進行應用拆分。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
-
分布式服務架構
- 當垂直應用過多,將核心業務獨立服務。然后提供給其他項目內部調用。此時,用於提高業務復用及整合的分布式服務框架(RPC)是關鍵。
-
流動計算架構
- 當服務更多的時候,對流量的控制,服務的限流,熔斷等操作。而且還需要管理集群容量,提供集群利用率。此時,用於提高機器利用率的資源調度和治理中心(SOA)是關鍵。
需求
dubbo解決下面幾個需求
- 當服務越來越多時,服務 URL 配置管理變得非常困難,F5 硬件負載均衡器的單點壓力也越來越大
- 服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動
- 服務的調用量越來越大,服務的容量問題就暴露出來 機器管理,流量的控制等
架構
節點角色說明
節點 | 角色說明 |
---|---|
Provider |
暴露服務的服務提供方 |
Consumer |
調用遠程服務的服務消費方 |
Registry |
服務注冊與發現的注冊中心 |
Monitor |
統計服務的調用次數和調用時間的監控中心 |
Container |
服務運行容器 |
調用關系說明
- 服務容器負責啟動,加載,運行服務提供者
- 服務提供者在啟動時,向注冊中心注冊自己提供的服務
- 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基於長連接推送變更數據給消費者。
- 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
- 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鍾發送一次統計數據到監控中心。
Dubbo 架構 下面特點 連通性、健壯性、伸縮性、以及向未來架構的升級性
連通性
- 注冊中心負責服務地址的注冊與查找,相當於目錄服務,服務提供者和消費者只在啟動時與注冊中心交互,注冊中心不轉發請求,壓力較小
- 監控中心負責統計各服務調用次數,調用時間等,統計先在內存匯總后每分鍾一次發送到監控中心服務器,並以報表展示
- 服務提供者向注冊中心注冊其提供的服務,並匯報調用時間到監控中心,此時間不包含網絡開銷
- 服務消費者向注冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,同時匯報調用時間到監控中心,此時間包含網絡開銷
- 注冊中心,服務提供者,服務消費者三者之間均為長連接,監控中心除外
- 注冊中心通過長連接感知服務提供者的存在,服務提供者宕機,注冊中心將立即推送事件通知消費者
- 注冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表
- 注冊中心和監控中心都是可選的,服務消費者可以直連服務提供者
健壯性
- 監控中心宕掉不影響使用,只是丟失部分采樣數據
- 數據庫宕掉后,注冊中心仍能通過緩存提供服務列表查詢,但不能注冊新服務
- 注冊中心對等集群,任意一台宕掉后,將自動切換到另一台
- 注冊中心全部宕掉后,服務提供者和服務消費者仍能通過本地緩存通訊
- 服務提供者無狀態,任意一台宕掉后,不影響使用
- 服務提供者全部宕掉后,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復
伸縮性
- 注冊中心為對等集群,可動態增加機器部署實例,所有客戶端將自動發現新的注冊中心
- 服務提供者無狀態,可動態增加機器部署實例,注冊中心將推送新的服務提供者信息給消費者
升級性
- 需要實現動態部署,進行流動計算
- 下圖是未來可能的一種架構
節點角色說明
節點 | 角色說明 |
---|---|
Deployer |
自動部署服務的本地代理 |
Repository |
倉庫用於存儲服務應用發布包 |
Scheduler |
調度中心基於訪問壓力自動增減服務提供者 |
Admin |
統一管理控制台 |
Registry |
服務注冊與發現的注冊中心 |
Monitor |
統計服務的調用次數和調用時間的監控中心 |
Dubbo源代碼項目結構
**模塊分包 ** 每個模塊都是相互隔離的,可插拔的。下面的這個圖是模塊引用圖
下面對着這些模塊做個簡單介紹
-
**dubbo-common **
- 公共邏輯模塊:包括 Util 類和通用模型。
-
**dubbo-remoting **
- 遠程通訊模塊:相當於 Dubbo 協議的實現,如果 RPC 用 RMI協議則不需要使用此包。
-
dubbo-rpc
- ** 遠程調用模塊**:抽象各種協議,以及動態代理,只包含一對一的調用,不關心集群的管理。
-
dubbo-cluster
-
** 集群模塊**:將多個服務提供方偽裝為一個提供方,
-
包括:負載均衡, 容錯,路由等,集群的地址列表可以是靜態配置的,也可以是由注冊中心下發。
-
-
**dubbo-registry **
- 注冊中心模塊:基於注冊中心下發地址的集群方式,以及對各種注冊中心的抽象
-
dubbo-monitor
- ** 監控模塊**:統計服務調用次數,調用時間的,調用鏈跟蹤的服務。
-
**dubbo-config **
- 配置模塊:是 Dubbo 對外的 API,用戶通過 Config 使用D ubbo,隱藏 Dubbo 所有細節。
-
**dubbo-container **
- 容器模塊:是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啟動,
- 因為服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務。
整體上按照分層結構進行分包,與分層的不同點在於:
- container 為服務容器,用於部署運行服務,沒有在層中畫出。
- protocol 層和 proxy 層都放在 rpc 模塊中,這兩層是 rpc 的核心,在不需要集群也就是只有一個提供者時,可以只使用這兩層完成 rpc 調用。
- transport 層和 exchange 層都放在 remoting 模塊中,為 rpc 調用的通訊基礎。
- serialize 層放在 common 模塊中,以便更大程度復用。
依賴關系
圖例說明:
- 圖中小方塊 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表層或模塊,藍色的表示與業務有交互,綠色的表示只對 Dubbo 內部交互。
- 圖中背景方塊 Consumer, Provider, Registry, Monitor 代表部署邏輯拓撲節點。
- 圖中藍色虛線為初始化時調用,紅色虛線為運行時異步調用,紅色實線為運行時同步調用。
- 圖中只包含 RPC 的層,不包含 Remoting 的層,Remoting 整體都隱含在 Protocol 中。
下面對各個模塊進行分解介紹
dubbo-common
公共邏輯模塊:包括 Util 類和通用模型。
作用提供一些工具類和通用模型 例如
com.alibaba.dubbo.common.URL
:
dubbo-remoting
遠程通訊模塊:相當於 Dubbo 協議的實現,如果 RPC 用 RMI協議則不需要使用此包。
- dubbo-remoting-zookeeper
- 相當於 Zookeeper 客戶端,與ZK 服務器通信
- dubbo-remoting-api
- 定義Dubbo CLient和 Dubbo Server的接口規則
- 實現
dubbo-remoting-api
dubbo-rpc
遠程調用模塊:抽象各種協議,以及動態代理,只包含一對一的調用,不關心集群的管理
集群相關的管理,由 dubbo-cluster
提供特性
dubbo-rpc-api
- 抽象各種協議以及動態代理,實現了一對一的調用。
- 其他模塊,實現
dubbo-rpc-api
,提供對應的協議實現 dubbo-rpc-default
- 對應
dubbo://
協議。
- 對應
dubbo-cluster
集群模塊:將多個服務提供方偽裝為一個提供方,包括:負載均衡, 集群容錯,路由,分組聚合等。集群的地址列表可以是靜態配置的,也可以是由注冊中心下發。
- 注冊中心下發,由
dubbo-registry
提供特性。
- 容錯
com.alibaba.dubbo.rpc.cluster.Cluster
接口 +com.alibaba.dubbo.rpc.cluster.support
包。- Cluster 將 Directory 中的多個 Invoker 偽裝成一個 Invoker,對上層透明,偽裝過程包含了容錯邏輯,調用失敗后,重試另一個。
- 拓展參見 《Dubbo 用戶指南 —— 集群容錯》 和 《Dubbo 開發指南 —— 集群擴展》 文檔。
- 目錄
com.alibaba.dubbo.rpc.cluster.Directory
接口 +com.alibaba.dubbo.rpc.cluster.directory
包。- Directory 代表了多個 Invoker ,可以把它看成 List ,但與 List 不同的是,它的值可能是動態變化的,比如注冊中心推送變更。
- 路由
com.alibaba.dubbo.rpc.cluster.Router
接口 +com.alibaba.dubbo.rpc.cluster.router
包。- 負責從多個
Invoker
中按路由規則選出子集,比如讀寫分離,應用隔離等。 - 拓展參見 《Dubbo 用戶指南 —— 路由規則》 和 《Dubbo 開發指南 —— 路由拓展》 文檔。
- 配置
com.alibaba.dubbo.rpc.cluster.Configurator
接口 +com.alibaba.dubbo.rpc.cluster.configurator
包。- 拓展參見 《Dubbo 用戶指南 —— 配置規則》 文檔。
- 負載均衡
com.alibaba.dubbo.rpc.cluster.LoadBalance
接口 +com.alibaba.dubbo.rpc.cluster.loadbalance
包。- LoadBalance 負責從多個 Invoker 中選出具體的一個用於本次調用,選的過程包含了負載均衡算法,調用失敗后,需要重選。
- 拓展參見 《Dubbo 用戶指南 —— 負載均衡》 和 《Dubbo 開發指南 —— 負載均衡拓展》 文檔。
- 合並結果
com.alibaba.dubbo.rpc.cluster.Merger
接口 +com.alibaba.dubbo.rpc.cluster.merger
包。- 合並返回結果,用於分組聚合。
- 拓展參見 《Dubbo 用戶指南 —— 分組聚合》 和 《Dubbo 開發指南 —— 合並結果擴展》 文檔。
整體流程如下:
dubbo-registry
注冊中心模塊:基於注冊中心下發地址的集群方式,以及對各種注冊中心的抽象。
dubbo-registry-api
,抽象注冊中心的注冊與發現接口。- 其他模塊,實現
dubbo-registry-api
,提供對應的注冊中心實現。在 《用戶指南 —— 注冊中心參考手冊》 中,可以看到每種注冊中心的介紹。 - 另外,
dubbo-registry-default
對應 Simple 注冊中心。 - 拓展參見 《Dubbo 開發指南 —— 注冊中心擴展》 文檔。
dubbo-monitor
監控模塊:統計服務調用次數,調用時間的,調用鏈跟蹤的服務
- 拓展參見 《Dubbo 開發指南 —— 監控中心擴展》 。
dubbo-config
配置模塊:是 Dubbo 對外的 API,用戶通過 Config 使用Dubbo,隱藏 Dubbo 所有細節。
推薦閱讀 《Dubbo 開發指南 —— 配置設計》 。
dubbo-container
容器模塊:是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啟動,
因為服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務。
-
dubbo-container-api
:定義了com.alibaba.dubbo.container.Container
接口,並提供 加載所有容器啟動的 Main 類。 -
實現
dubbo-container-api
dubbo-container-spring
,提供了com.alibaba.dubbo.container.spring.SpringContainer
。dubbo-container-log4j
,提供了com.alibaba.dubbo.container.log4j.Log4jContainer
。dubbo-container-logback
,提供了com.alibaba.dubbo.container.logback.LogbackContainer
。
-
拓展參考 《Dubbo 用戶指南 —— 服務容器》 和 《Dubbo 開發指南 —— 容器擴展》 文檔。
dubbo-filter
過濾器模塊:提供了內置的過濾器。
-
dubbo-filter-cache
,緩存過濾器。
- 拓展參考 《Dubbo 用戶指南 —— 結果緩存》 和 《Dubbo 開發指南 —— 緩存拓展》 文檔。
-
dubbo-filter-validation
,參數驗證過濾器。
- 拓展參考 《Dubbo 用戶指南 —— 參數驗證》 和 《Dubbo 開發指南 —— 驗證擴展》 文檔。
dubbo-plugin
過濾器模塊:提供了內置的插件。
-
dubbo-qos
,提供在線運維命令。
hessian-lite
hessian-lite
:Dubbo 對 Hessian 2 的 序列化 部分的精簡、改進、BugFix 。
提交歷史如下:
dubbo-demo
dubbo-demo
快速啟動示例。
參見 《Dubbo 用戶指南 —— 快速啟動》 文檔。
dubbo-test
dubbo-test
測試模塊。
-
dubbo-test-benchmark
,性能測試。
- 參考 《Dubbo 用戶指南 —— 性能測試報告》 文檔。
-
dubbo-test-compatibility
,兼容性測試。
dubbo-test-spring3
,測試對 Spring 3 的兼容性。
-
dubbo-test-example
,使用示例。
Maven POM
dubbo-dependencies-bom
dubbo-dependencies-bom/pom.xml
,Maven BOM(Bill Of Materials) ,統一定義了 Dubbo 依賴的三方庫的版本號:
dubbo-parent
會引入該 BOM :
dubbo-bom
dubbo-bom/pom.xml
,Maven BOM(Bill Of Materials) ,統一定義了 Dubbo 的版本號:
dubbo-parent
dubbo/pom.xml
,Dubbo Parent Pom 。Dubbo 的 Maven 模塊,都會引入該 pom 文件。以
dubbo-cluster
舉例子:
3.14.4 dubbo-all
dubbo/all/pom.xml
,Dubbo All Pom ,定義了 Dubbo 的打包腳本。
我們在使用 Dubbo 庫時,引入該 pom 文件。
引用參考自 下列文章
http://svip.iocoder.cn/Dubbo/intro/
https://dubbo.incubator.apache.org/zh-cn/docs/user/preface/background.html
https://dubbo.incubator.apache.org/zh-cn/docs/user/preface/architecture.html
https://dubbo.incubator.apache.org/zh-cn/docs/dev/build.html