一文瞭解 Dubbo 的代碼架構

来源:https://www.cnblogs.com/apache-dubbo/archive/2022/12/17/16988644.html
-Advertisement-
Play Games

1、設計想法 原理與之前的串口發送模塊一樣,1位的數據位和8位的數據位再加上1位的停止位。唯一不同的是在接收的時候要考慮到有干擾的情況下,為了避免干擾,我們對每位數據進行多次採樣,按出現概率大的值為該數據位的值。 如果按照通常想法在每bits位中間取值的話,bit3位出現圖中的干擾很有可能會讀出錯誤 ...


整體設計

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

圖例說明:

  • 圖中左邊淡藍背景的為服務消費方使用的介面,右邊淡綠色背景的為服務提供方使用的介面,位於中軸線上的為雙方都用到的介面。
  • 圖中從下至上分為十層,各層均為單向依賴,右邊的黑色箭頭代表層之間的依賴關係,每一層都可以剝離上層被覆用,其中,Service 和 Config 層為 API,其它各層均為 SPI。
  • 圖中綠色小塊的為擴展介面,藍色小塊為實現類,圖中只顯示用於關聯各層的實現類。
  • 圖中藍色虛線為初始化過程,即啟動時組裝鏈,紅色實線為方法調用過程,即運行時調時鏈,紫色三角箭頭為繼承,可以把子類看作父類的同一個節點,線上的文字為調用的方法。

各層說明

  • 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

關係說明

  • 在 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 實際上不算一層,而是一個獨立的節點,只是為了全局概覽,用層的方式畫在一起。

模塊分包

/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 使用Dubbo,隱藏 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 中。

調用鏈

展開總設計圖的紅色調用鏈,如下:

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

暴露服務時序

展開總設計圖右邊服務提供方暴露服務的藍色初始化鏈,時序圖如下:

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

引用服務時序

展開總設計圖左邊服務消費方引用服務的綠色初始化鏈,時序圖如下:

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

領域模型

在 Dubbo 的核心領域模型中:

  • Protocol 是服務域,它是 Invoker 暴露和引用的主功能入口,它負責 Invoker 的生命周期管理。
  • Invoker 是實體域,它是 Dubbo 的核心模型,其它模型都向它靠攏,或轉換成它,它代表一個可執行體,可向它發起 invoke 調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集群實現。
  • Invocation 是會話域,它持有調用過程中的變數,比如方法名,參數等。

基本設計原則

  • 採用 Microkernel + Plugin 模式,Microkernel 只負責組裝 Plugin,Dubbo 自身的功能也是通過擴展點實現的,也就是 Dubbo 的所有功能點都可被用戶自定義擴展所替換。
  • 採用 URL 作為配置信息的統一格式,所有擴展點都通過傳遞 URL 攜帶配置信息。

搜索關註官方微信公眾號:Apache Dubbo,瞭解更多業界最新動態,掌握大廠面試必備 Dubbo 技能


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 家居網購項目實現03 8.功能07-後臺管理 顯示家居 8.1需求分析/圖解 給後臺管理提供獨立登錄頁面,管理員登錄地址不對外公開 管理員登錄成功後,顯示管理菜單頁面 管理員點擊家居管理,顯示所有家居信息 8.2思路分析 ps:實現管理員登錄功能,方案一是將管理員視為member,添加到member ...
  • 完美流程,提供所有安裝包激活碼,解決pycharm安裝激活問題!建議收藏!!! 1.安裝 Pycharm2019.1.3 安裝包下載地址: 鏈接:https://pan.baidu.com/s/10r-sMUJh7YKS_TP05NehCQ?pwd=1234 提取碼:1234 1.1.雙擊運行電腦中 ...
  • 大家好,歡迎來到 Crossin的編程教室 ! 看過我Python入門教程的朋友應該會看到其中有提到一個點球小游戲的作業。 在世界盃決賽即將到來之際,我們再來回顧一下這個小游戲。對於剛剛學習編程不久的同學,這是個不錯的練手習題,可以嘗試自己寫一寫。 【視頻】用Python寫個“點球大戰”小游戲 先說 ...
  • File對象測試數據的讀寫與操作 #def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open #file ...
  • f-string,亦稱為格式化字元串常量(formatted string literals),是Python3.6新引入的一種字元串格式化方法,該方法源於PEP 498 – Literal String Interpolation,主要目的是使格式化字元串的操作更加簡便。 ...
  • 問題描述 fastjson通過代碼指定全局序列化返回時間格式,導致使用JSONField註解標註屬性的特殊日期返回格式失效 使用版本 | 應用名稱 | 版本 | | | | | springboot | 2.0.0.RELEASE | | fastjson | 1.2.83 | 全局設置代碼 pub ...
  • 一、前言 最近學習pyqt5中文教程時,最後一個例子製作了一個俄羅斯方塊小游戲,由於解釋的不是很清楚,所以源碼有點看不懂,查找網上資料後,大概弄懂了源碼的原理。 二、繪製主視窗 將主視窗居中,且設置了一個狀態欄來顯示三種信息:消除的行數,游戲暫停狀態或者游戲結束狀態。 class Tetris(QM ...
  • JZ46 把數字翻譯成字元串 描述 有一種將字母編碼成數字的方式:'a'->1, 'b->2', ... , 'z->26'。 現在給一串數字,返回有多少種可能的解碼結果 示例1 輸入: "12" 返回值:2 說明: 2種可能的解碼結果(”ab” 或”l”) 思路 思路: 對於普通數組1-9,解碼方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...