1. 程式人生 > >Dubbo 入門之二 ——- 專案結構解析

Dubbo 入門之二 ——- 專案結構解析

本文主要說明點

  1. 概述
  2. 背景
  3. 需求
  4. 架構
  5. Dubbo原始碼專案結構

概述

分享 Dubbo 的專案結構 ,通過本文可以大致瞭解到Dubbo整個專案的結構

背景

將一個專案進行拆分, 進行分散式架構。

image

需要解決下面的問題

  • 單一應用架構

    • 網站流量少時單一架構,簡化開發。此時,用於簡化增刪改查工作量的資料訪問框架(ORM)是關鍵。
  • 垂直應用架構

    • 訪問大時單一應用速度過小,需要進行應用拆分。此時,用於加速前端頁面開發的Web框架(MVC)是關鍵。
  • 分散式服務架構

    • 當垂直應用過多,將核心業務獨立服務。然後提供給其他專案內部呼叫。此時,用於提高業務複用及整合的分散式服務框架(RPC)是關鍵。
  • 流動計算架構

    • 當服務更多的時候,對流量的控制,服務的限流,熔斷等操作。而且還需要管理叢集容量,提供叢集利用率。此時,用於提高機器利用率的資源排程和治理中心(SOA)是關鍵。

需求

image

dubbo解決下面幾個需求

  1. 當服務越來越多時,服務 URL 配置管理變得非常困難,F5 硬體負載均衡器的單點壓力也越來越大
  2. 服務間依賴關係變得錯蹤複雜,甚至分不清哪個應用要在哪個應用之前啟動
  3. 服務的呼叫量越來越大,服務的容量問題就暴露出來 機器管理,流量的控制等

架構

dubbo-architucture

節點角色說明

節點 角色說明
Provider 暴露服務的服務提供方
Consumer 呼叫遠端服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器

呼叫關係說明

  1. 服務容器負責啟動,載入,執行服務提供者
  2. 服務提供者在啟動時,向註冊中心註冊自己提供的服務
  3. 服務消費者在啟動時,向註冊中心訂閱自己所需的服務。
  4. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連線推送變更資料給消費者。
  5. 服務消費者,從提供者地址列表中,基於軟負載均衡演算法,選一臺提供者進行呼叫,如果呼叫失敗,再選另一臺呼叫。
  6. 服務消費者和提供者,在記憶體中累計呼叫次數和呼叫時間,定時每分鐘傳送一次統計資料到監控中心。

Dubbo 架構 下面特點 連通性、健壯性、伸縮性、以及向未來架構的升級性

連通性

  • 註冊中心負責服務地址的註冊與查詢,相當於目錄服務,服務提供者和消費者只在啟動時與註冊中心互動,註冊中心不轉發請求,壓力較小
  • 監控中心負責統計各服務呼叫次數,呼叫時間等,統計先在記憶體彙總後每分鐘一次傳送到監控中心伺服器,並以報表展示
  • 服務提供者向註冊中心註冊其提供的服務,並彙報呼叫時間到監控中心,此時間不包含網路開銷
  • 服務消費者向註冊中心獲取服務提供者地址列表,並根據負載演算法直接呼叫提供者,同時彙報呼叫時間到監控中心,此時間包含網路開銷
  • 註冊中心,服務提供者,服務消費者三者之間均為長連線,監控中心除外
  • 註冊中心通過長連線感知服務提供者的存在,服務提供者宕機,註冊中心將立即推送事件通知消費者
  • 註冊中心和監控中心全部宕機,不影響已執行的提供者和消費者,消費者在本地快取了提供者列表
  • 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者

健壯性

  • 監控中心宕掉不影響使用,只是丟失部分取樣資料
  • 資料庫宕掉後,註冊中心仍能通過快取提供服務列表查詢,但不能註冊新服務
  • 註冊中心對等叢集,任意一臺宕掉後,將自動切換到另一臺
  • 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地快取通訊
  • 服務提供者無狀態,任意一臺宕掉後,不影響使用
  • 服務提供者全部宕掉後,服務消費者應用將無法使用,並無限次重連等待服務提供者恢復

伸縮性

  • 註冊中心為對等叢集,可動態增加機器部署例項,所有客戶端將自動發現新的註冊中心
  • 服務提供者無狀態,可動態增加機器部署例項,註冊中心將推送新的服務提供者資訊給消費者

升級性

  • 需要實現動態部署,進行流動計算
  • 下圖是未來可能的一種架構

dubbo-architucture-futures

節點角色說明

節點 角色說明
Deployer 自動部署服務的本地代理
Repository 倉庫用於儲存服務應用釋出包
Scheduler 排程中心基於訪問壓力自動增減服務提供者
Admin 統一管理控制檯
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心

Dubbo原始碼專案結構

模組分包 每個模組都是相互隔離的,可插拔的。下面的這個圖是模組引用圖

/dev-guide/images/dubbo-modules.jpg

下面對著這些模組做個簡單介紹

  • 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 模組中,以便更大程度複用。

依賴關係

/dev-guide/images/dubbo-relation.jpg

圖例說明:

  • 圖中小方塊 Protocol, Cluster, Proxy, Service, Container, Registry, Monitor 代表層或模組,藍色的表示與業務有互動,綠色的表示只對 Dubbo 內部互動。
  • 圖中背景方塊 Consumer, Provider, Registry, Monitor 代表部署邏輯拓撲節點。
  • 圖中藍色虛線為初始化時呼叫,紅色虛線為執行時非同步呼叫,紅色實線為執行時同步呼叫。
  • 圖中只包含 RPC 的層,不包含 Remoting 的層,Remoting 整體都隱含在 Protocol 中。

下面對各個模組進行分解介紹

dubbo-common

公共邏輯模組:包括 Util 類和通用模型。

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 ,基於 JettyTomcat 實現。
    • 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 提供特性。

整體流程如下:

叢集容錯

dubbo-registry

註冊中心模組:基於註冊中心下發地址的叢集方式,以及對各種註冊中心的抽象。

dubbo-registry 包結構

  • dubbo-registry-api抽象註冊中心的註冊與發現介面。
  • 其他模組,實現 dubbo-registry-api ,提供對應的註冊中心實現。在 《使用者指南 —— 註冊中心參考手冊》 中,可以看到每種註冊中心的介紹。
  • 另外,dubbo-registry-default 對應 Simple 註冊中心。

dubbo-monitor

監控模組:統計服務呼叫次數,呼叫時間的,呼叫鏈跟蹤的服務

dubbo-monitor 包結構

dubbo-config

配置模組:是 Dubbo 對外的 API,使用者通過 Config 使用Dubbo,隱藏 Dubbo 所有細節。

dubbo-config 包結構

dubbo-container

容器模組:是一個 Standlone 的容器,以簡單的 Main 載入 Spring 啟動,

因為服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去載入服務。

dubbo-container 包結構

  • 實現

    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-filter

過濾器模組:提供了內建的過濾器。

dubbo-filter 包結構

dubbo-plugin

過濾器模組:提供了內建的外掛。

dubbo-plugin 包結構

hessian-lite

提交歷史如下:

hessian-lite 提交歷史

dubbo-demo

dubbo-test

dubbo-test 包結構

  • 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 的 Maven 模組,都會引入該 pom 檔案。以 dubbo-cluster 舉例子:

引入關係

3.14.4 dubbo-all

dubbo/all/pom.xml ,Dubbo All Pom ,定義了 Dubbo 的打包指令碼

我們在使用 Dubbo 庫時,引入該 pom 檔案。