Dubbo源碼解析(一)初識dubbo

最近一直在看dubbo 源碼,總是靜不下來,漂在表面,做了一些筆記,但是想想,很多東西總是要靠自己寫一寫,記錄一下,纔會有不一樣的收穫和心得,我想逼自己一把,所以關於dubbo 源碼解析,不如大家理解爲dubbo源碼導讀和筆記吧。

1.Dubbo你到底是什麼?

dubbo 官方文檔:http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
dubbo的官方文檔可能是我見過寫的最好的官方文檔了,沒有之一,所以官方文檔上說:Apache Dubbo是一款高性能、輕量級基於Java的RPC開源框架

2.什麼是rpc?

我之前有寫過一片介紹RPC的文章https://blog.csdn.net/CoreyXuu/article/details/106397232 感興趣可以看看,這裏解釋下:

RPC英文全名爲Remote Procedure Call 也叫遠程調用,其實就是一個計算機通訊協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。

2.1.那個這裏肯定會有人想知道 http 和 Rpc 協議有什麼區別?(記住,後面要考的)

我們都知道http 屬於應用曾面的,而http是跨越了應用層和傳輸曾,http本身的三次握手,每發送一次請求,都會又一次建立連接的過程,那麼相對的肯定會帶來一定的延遲,而http本身的報文很大,而RPC則可以更具需求進行連接,調用結束後就會斷掉,也可以是長連接,多個遠程過程調用共享同一個鏈接,所以RPC和效率相比較http的效率高一些,但是相對於開發簡單快速的HTTP服務,RPC服務就會顯得複雜一些。

3.dubbo的版本策略

這個地方我深有體會,爲此我還專門總結了一套文檔(工作需求)
量大版本並行發展:
2.5.x是穩定版本
2.6.x是新功能實驗版本
2.6 上 實驗都穩定以後,會遷移到2.5版本
2.7 上也是實驗版本,實驗穩定也會遷移到2.5
所以如果你想了解dubbo最新 最牛逼的功能,可以選擇2.6 -2.7 版本。
所以接下來我會專門介紹2.7.x版本

4.dubbo 框架設計

關於dubbo 官方文檔這裏就不再介紹了,彩虹屁以後可以刷一波了

4.1 首先來看下dubbo的框架設計

在這裏插入圖片描述
可以看到dubbo被拆分成很多maven項目,屏幕太小沒有截全,接下來我介紹下每個模塊的作用,官方文檔有一個這樣的圖,
在這裏插入圖片描述

4.2dubbo中maven相關的依賴

dubbo-bom/pom。利用maven bom統一定義了dubbo的版本好,dubbo-demo中的pom文件中都會引用,dubbo-bom/pom.xml, 例如dubbo-demo
在這裏插入圖片描述
dubbo-dependencies-bom/pom.xml:利用Maven BOM統一定義了dubbo依賴的第三方庫的版本號。dubbo-parent會引入該bom:
在這裏插入圖片描述
all/pom.xml:定義了dubbo的打包腳本,使用dubbo庫的時候,需要引入改pom文件。
dubbo-parent:是dubbo的父pom,dubbo的maven模塊都會引入該pom文件。

模塊介紹:

4.4.1dubbo-common:公共邏輯模塊

包括 Util 類和通用模型。我的理解是,工具類就是一些公用的地方,通用模型就是貫穿整合項目的統一格式的模型,比如URL和,上述就提到了URL貫穿了整個項目。
在這裏插入圖片描述

4.4.2dubbo-remoting:遠程通訊模塊

**官網:**相當於dubbo協議的實現,如果 RPC 用 RMI協議則不需要使用此包。
自己理解:提供了各種客戶端和服務端的通信功能,例如;grizzly,netty,tomcat,RPC除了rmi的協議都要用到此模塊
在這裏插入圖片描述

  1. dubbo-remoting-api:定義了客戶端和服務端的連接
  2. dubbo-remoting-grizzly;基於grizzly實現的service和client
  3. dubbo-remoting-http;基於Jetty或Tomcat實現的Client和Server。
  4. dubbo-remoting-mina;基於Mina實現的Client和Server。
  5. dubbo-remoting-netty4;基於Netty4實現的Client和Server
  6. dubbo-remoting-p2p; P2P服務器,註冊中心multicast中會用到這個服務器使用
  7. dubbo-remoting-zookeeper;封裝了Zookeeper Client ,和 Zookeeper Server 通信
4.4.3dubbo-rpc:遠程調用模塊

官網:抽象各種協議,以及動態代理,只包含1對1的調用,不關心集羣的管理
個人理解:遠程調用,最主要的肯定是協議,dubbo提供了非常多的協議實現,不過官方推薦的還是自己的dubbo協議,還給出了一份性能檢測報告

性能報告地址:http://dubbo.apache.org/zh-cn/docs/user/perf-test.html

這個模塊依賴與dubbo-remoting模塊,抽象了各類的協議。
在這裏插入圖片描述

  1. dubbo-rpc-api 抽象了動態代理的各種協議,實現了一對一的調用
  2. 包都是各種協議的實現
4.4.4dubbo-cluster:集羣模塊

將多個服務提供方僞裝爲一個提供方,包括,負載均衡,容錯,路由等,集羣的地址列表可以是靜態配置,也可以是註冊中心下發,
在這裏插入圖片描述
自己的理解爲:這個是一個解決出錯情況的採用的策略,這個模塊裏封裝了多個策略的實現方法。並且也支持自己擴展集羣容錯策略,cluster把多個Invoker僞裝成一個Invoker,並且在僞裝的過程中加入了容錯邏輯,失敗了重試下一個!
如下圖dubbo-cluster 目錄結構
在這裏插入圖片描述

  1. configurator包:配置包,dubbo的基本設計原理都是採用url作爲配置信息的統一格式,所有拓展點都通過傳遞URL攜帶配置信息,這個包就是更具統一配置規則生成配置信息
  2. directory包;Directory代表了多個Invoker,並且它的值會隨着註冊中心的服務變更推送而變化,這裏介紹下Invoker,Invoker是Provider的一個調用Service的抽象,Invoker封裝了Provider地址以及Service接口信息。
  3. loadbalance包;封裝了負載均衡的實現,負責利用負載均衡算法,從多個Invoker中選出具體的一個Invoker用於此次的調用,如果調用失敗,則需要重新選擇。
  4. merger包:封裝了合併返回結果,分組聚合到方法,支持多種數據結構類型。
  5. router包:封裝了路由規則的實現,路由規則決定了一次dubbo服務調用的目標服務器,路由規則分兩種:條件路由規則和腳本路由規則,並且支持可拓展。
  6. support包:封裝了各類Invoker和cluster,包括集羣容錯模式和分組聚合的cluster以及相關的Invoker。
  7. governance包:spi 擴展服務治理包
  8. interceptor包:選擇一個特定的地址調用程序之前在最外層工作
4.4.5 dubbo-registry:註冊中心模塊

官方:基於註冊中心下發地址的集羣方式以及對各種註冊中心的抽象。
自己理解爲:dubbo註冊中心的實現是由Multicast註冊中心,zookeeper註冊中心,和Redis註冊中心,eurrka註冊中心,sofa註冊中心,具體怎麼實現,後面在總結一下,這個模塊封裝了dubbo所支持的註冊中心的實現,
在這裏插入圖片描述
1.dubbo-registry-api:抽象了註冊中心的註冊發現,實現了一些公用的方法,讓子類只關注重要的方法,
2.接下來的就是模塊就是註冊中心的實現方法的封裝,其中dubbo-registry-default就是官方文檔裏面的Simple註冊中心。

4.4.6 dubbo-monitor:監控模塊

官方: 統計服務調用次數,調用時間的,調用鏈跟蹤的服務
個人理解:這個模塊很清楚,就是對服務的監控
在這裏插入圖片描述
1.dubbo-monitor-api;定義了monitor相關的接口,實現了監控所需要的過濾器
2.dubbo-monitor-default;實現了dubbo相關的監控功能

4.4.7 dubbo-config:配置模塊

官網:是dubbo對外的api,通過config使用dubbo模塊,隱藏dubbo所有細節
個人理解就是:用戶都是使用配置來使用api,dubbo提供了四種配置方式,包括xml,屬性配置,api配置,註解配置,配置模塊就是實現了這四種配置
在這裏插入圖片描述

  1. dubbo-config-api 實現了api配置和屬性配置的功能
  2. dubbo-config-spring 實現了xml配置和註解配置
4.4.8 dubbo-container 容器模塊

官方;是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啓動,,因爲服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務.(這個是重點,記住,要考的!!)

個人理解:因爲後臺不需要tomcat/joboss等容器的功能,不需要用這些厚重的容器去加載服務的提供方,既浪費資源,又增加了複雜度,服務容器只是一個簡單的main方法,加載一些內置容器,也支持擴展容器
在這裏插入圖片描述

  1. dubbo-container-api:定義了Container接口,實現了服務加載的Main方法。
  2. 其他三個分別提供了對應的容器,供Main方法加載
4.4.9 dubbo-demo 示例模塊

這個模塊示快速啓動示例,包含了服務提供和服務調用,註冊中心示multicast,調用方式是xml 具體比較簡單,可以參見官方文檔
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html

在這裏插入圖片描述

4.4.10 dubbo-filter 過濾器模塊

這個模塊提供了內置的一些過濾器
在這裏插入圖片描述

  1. dubbo-filter-cache 提供緩存過濾器
  2. dubbo-filter-validation;提供參數校驗過濾器
4.4.10 dubbo-plugs 過濾器模塊

提供內置插件
在這裏插入圖片描述
dubbo-qos:提供了在線運維的命令。
dubbo-auth:提供了權限控制

4.4.11 dubbo-serialization——序列化模塊

該組件提供了支持各種序列化框架的實現
在這裏插入圖片描述
1.dubbo-serialization-api:定義了Serialization的接口以及數據輸入輸出的接口。
2.其他的包都是實現了對應的序列化框架的方法。dubbo內置的就是這幾類的序列化框架,序列化也支持擴展

總結:

dubbo的主要核型模塊就是上面的例子了,接下來我按照上面的模塊來進行閱讀源碼和分析總結

Reference:
http://dubbo.apache.org/zh-cn/docs/user/new-features-in-a-glance.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章