Dubbo (二) ——- 項目結構解析

本文主要說明點html

概述前端

背景java

需求git

架構github

Dubbo源代碼項目結構算法

概述spring

分享 Dubbo 的項目結構 ,經過本文能夠大體瞭解到Dubbo整個項目的結構數據庫

背景apache

將一個項目進行拆分, 進行分佈式架構。api

須要解決下面的問題

單一應用架構

網站流量少時單一架構,簡化開發。此時,用於簡化增刪改查工做量的數據訪問框架(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-remoting-grizzly ,基於 Grizzly 實現。

dubbo-remoting-http ,基於 Jetty 或 Tomcat 實現。

dubbo-remoting-mina ,基於 Mina 實現。

dubbo-remoting-netty ,基於 Netty 3 實現。

dubbo-remoting-netty4 ,基於 Netty 4 實現。

dubbo-remoting-p2p ,P2P 服務器。註冊中心 dubbo-registry-multicast 項目的使用該項目。

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-config-api ,實現了 API 配置 和 屬性配置 功能。

dubbo-config-spring ,實現了 XML 配置 和 註解配置 功能。

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

,提供在線運維命令。

拓展參考 《Dubbo 用戶指南 —— 新版本 telnet 命令使用說明》 和 《Dubbo 開發指南 —— Telnet 命令擴展》 文檔。

hessian-lite

hessian-lite :Dubbo 對 Hessian 2 的 序列化 部分的精簡、改進、BugFix 。

提交歷史以下:

dubbo-demo

dubbo-demo 快速啓動示例 。

參見 《Dubbo 用戶指南 —— 快速啓動》 文檔。

dubbo-test

dubbo-test 測試模塊 。

在此我向你們推薦一個架構學習交流羣。交流學習羣號:821169538  裏面會分享一些資深架構師錄製的視頻錄像:有Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構等這些成爲架構師必備的知識體系。還能領取免費的學習資源,目前受益良多。

dubbo-test-benchmark

,性能測試。

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 舉例子:

出處: http://wsccoder.top/2018/10/15/Dubb

相關文章
相關標籤/搜索