dubbo源碼解析(一)Hello,Dubbo

Hello,Dubbo

你好,dubbo,初次見面,我想和你交個朋友。html

Dubbo你究竟是什麼?

先給出一套官方的說法:Apache Dubbo是一款高性能、輕量級基於Java的RPC開源框架。git

那麼什麼是RPC?
文檔地址: http://dubbo.apache.org/zh-cn...

文檔簡短形象的對單一應用架構、垂直應用架構、分佈式服務架構、流動計算架構作了一個對比,能夠很明白的看出這四個架構所適用的場景,由於業務需求愈來愈複雜,纔會有這一系列的演變。github

RPC英文全名爲Remote Procedure Call,也叫遠程過程調用,其實就是一個計算機通訊協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。計算機通訊協議有不少種,對於開發來講,不少熟悉的是HTTP協議,我這裏就作個簡單的比較,HTTP協議是屬於應用層的,而RPC跨越了傳輸層和應用層。HTTP自己的三次握手協議,每發送一次請求,都會有一次創建鏈接的過程,就會帶來必定的延遲,而且HTTP自己的報文龐大,而RPC能夠按需鏈接,調用結束後就斷掉,也能夠是長連接,多個遠程過程調用共享同一個連接,能夠看出來RPC的效率要高於HTTP,可是相對於開發簡單快速的HTTP服務,RPC服務就會顯得複雜一些。算法

回到原先的話題,繼續來聊聊dubbo。關於dubbo 的特色分別有連通性、健壯性、伸縮性、以及向將來架構的升級性。特色的詳細介紹也能夠參考上述連接的官方文檔。官方文檔擁有的內容我在這就不一一進行闡述了。spring

由於接下來須要對dubbo各個模塊的源碼以及原理進行解析,因此介紹一下dubbo的源碼庫,dubbo框架已經交由Apache基金會進行孵化,被掛在github開源。apache

github地址: https://github.com/apache/inc...

而後講一下dubbo的版本策略:兩個大版本並行發展,2.5.x是穩定版本,2.6.x是新功能實驗版本。2.6上實驗都穩定了之後,會遷移到2.5,因此若是你想了解dubbo最新的牛逼特性,就選擇2.6,不然用2.5版本。我接下來介紹都是基於2.6.x版本。bootstrap

dubbo框架設計介紹

dubbo的官方文檔真的寫的太好了,我在這裏仍是要誇讚一下。接下來我對整個框架設計的介紹是基於官方文檔的基礎上進行擴充,儘可能作到更加通俗易懂。api

咱們先來看看把源碼clone下來後的結構:

dubbo工程結構

能夠看到Dubbo被拆分紅不少的Maven項目(右邊的我尚未截全)接下來我會介紹左邊每一個模塊的大體做用。緩存

若是看過dubbo官方文檔的朋友確定看到過如下這個圖:服務器

dubbo-modules

​從以上這個圖咱們能夠清晰的看到各個模塊之間依賴關係,其實以上的圖只是展現了關鍵的模塊依賴關係,還有部分模塊好比dubbo-bootstrap清理模塊等,下面我會對各個模塊作個簡單的介紹,至少弄明白各個模塊的做用。

​先來說講上圖的幾個模塊:

(一)dubbo-registry——註冊中心模塊

官方文檔的解釋:基於註冊中心下發地址的集羣方式,以及對各類註冊中心的抽象。

個人理解是:dubbo的註冊中心實現有Multicast註冊中心、Zookeeper註冊中心、Redis註冊中心、Simple註冊中心(具體怎麼實現我在後面文章中會介紹),這個模塊就是封裝了dubbo所支持的註冊中心的實現。

看看registry目錄結構:

registry的目錄

  1. dubbo-registry-api:抽象了註冊中心的註冊和發現,實現了一些公用的方法,讓子類只關注部分關鍵方法。
  2. 如下四個包是分別是四種註冊中心實現方法的封裝,其中dubbo-registry-default就是官方文檔裏面的Simple註冊中心。
(二)dubbo-cluster——集羣模塊

官方文檔的解釋:將多個服務提供方假裝爲一個提供方,包括:負載均衡, 容錯,路由等,集羣的地址列表能夠是靜態配置的,也能夠是由註冊中心下發。

cluster流程圖

個人理解:它就是一個解決出錯狀況採用的策略,這個模塊裏面封裝了多種策略的實現方法,而且也支持本身擴展集羣容錯策略,cluster把多個Invoker假裝成一個Invoker,而且在假裝過程當中加入了容錯邏輯,失敗了,重試下一個。

看看cluster的目錄結構:

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。
(三)dubbo-common——公共邏輯模塊

官方文檔的解釋:包括 Util 類和通用模型。

個人理解:這個應該很通俗易懂,工具類就是一些公用的方法,通用模型就是貫穿整個項目的統一格式的模型,好比URL,上述就提到了URL貫穿了整個項目。

看看common的目錄:

dubbo-common

這個類中的包含義我就不一一講了,具體的介紹會穿插在後續文章中,由於這些都是工具類的一些實現,包的含義也很明顯。

(四)dubbo-config——配置模塊

官方文檔的解釋:是 Dubbo 對外的 API,用戶經過 Config 使用Dubbo,隱藏 Dubbo 全部細節。

個人理解:用戶都是使用配置來使用dubbo,dubbo也提供了四種配置方式,包括XML配置、屬性配置、API配置、註解配置,配置模塊就是實現了這四種配置的功能。

看看config的目錄:

dubbo-config

  1. dubbo-config-api:實現了API配置和屬性配置的功能。
  2. dubbo-config-spring:實現了XML配置和註解配置的功能。
(五)dubbo-rpc——遠程調用模塊

官方文檔的解釋:抽象各類協議,以及動態代理,只包含一對一的調用,不關心集羣的管理。

個人理解:遠程調用,最主要的確定是協議,dubbo提供了許許多多的協議實現,不過官方推薦時使用dubbo本身的協議,還給出了一份性能測試報告。

性能測試報告地址: http://dubbo.apache.org/zh-cn...

這個模塊依賴於dubbo-remoting模塊,抽象了各種的協議。

看看rpc的目錄:

dubbo-rpc

  1. dubbo-rpc-api:抽象了動態代理和各種協議,實現一對一的調用
  2. 另外的包都是各個協議的實現。
(六)dubbo-remoting——遠程通訊模塊

官方文檔的解釋:至關於 Dubbo 協議的實現,若是 RPC 用 RMI協議則不須要使用此包。

個人理解:提供了多種客戶端和服務端通訊功能,好比基於Grizzly、Netty、Tomcat等等,RPC用除了RMI的協議都要用到此模塊。

看看remoting的目錄:

dubbo-remoting

  1. dubbo-remoting-api:定義了客戶端和服務端的接口。
  2. dubbo-remoting-grizzly:基於Grizzly實現的Client和Server。
  3. dubbo-remoting-http:基於Jetty或Tomcat實現的Client和Server。
  4. dubbo-remoting-mina:基於Mina實現的Client和Server。
  5. dubbo-remoting-netty:基於Netty3實現的Client和Server。
  6. Dubbo-remoting-netty4:基於Netty4實現的Client和Server。
  7. dubbo-remoting-p2p:P2P服務器,註冊中心multicast中會用到這個服務器使用。
  8. dubbo-remoting-zookeeper:封裝了Zookeeper Client ,和 Zookeeper Server 通訊。
(七)dubbo-container——容器模塊

官方文檔的解釋:是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啓動,由於服務一般不須要 Tomcat/JBoss 等 Web 容器的特性,不必用 Web 容器去加載服務。

個人理解:由於後臺服務不須要Tomcat/JBoss 等 Web 容器的功能,不須要用這些厚實的容器去加載服務提供方,既資源浪費,又增長複雜度。服務容器只是一個簡單的Main方法,加載一些內置的容器,也支持擴展容器。

看看container的目錄:

dubbo-container

  1. dubbo-container-api:定義了Container接口,實現了服務加載的Main方法。
  2. 其餘三個分別提供了對應的容器,供Main方法加載。
(八)dubbo-monitor——監控模塊

官方文檔的解釋:統計服務調用次數,調用時間的,調用鏈跟蹤的服務。

個人理解:這個模塊很清楚,就是對服務的監控。

看看monitor的目錄:

dubbo-monitor

  1. dubbo-monitor-api:定義了monitor相關的接口,實現了監控所須要的過濾器。
  2. dubbo-monitor-default:實現了dubbo監控相關的功能。
(九)dubbo-bootstrap——清理模塊

這個模塊只有一個類,是做爲dubbo的引導類,而且在中止期間進行清理資源。具體的介紹我在後續文章中講解。

(十)dubbo-demo——示例模塊

這個模塊是快速啓動示例,其中包含了服務提供方和調用方,註冊中心用的是multicast,用XML配置方法,具體的介紹能夠看官方文檔。

示例介紹地址: http://dubbo.apache.org/zh-cn...
(十一)dubbo-filter——過濾器模塊

這個模塊提供了內置的一些過濾器。

看看filter的目錄:

dubbo-filter

  1. dubbo-filter-cache:提供緩存過濾器。
  2. dubbo-filter-validation:提供參數驗證過濾器。
(十二)dubbo-plugin——插件模塊

該模塊提供了內置的插件。

看看plugin的目錄:

dubbo-plugin

  1. dubbo-qos:提供了在線運維的命令。
(十三)dubbo-serialization——序列化模塊

該模塊中封裝了各種序列化框架的支持實現。

看看serialization的目錄:

dubbo-serialization

  1. dubbo-serialization-api:定義了Serialization的接口以及數據輸入輸出的接口。
  2. 其餘的包都是實現了對應的序列化框架的方法。dubbo內置的就是這幾類的序列化框架,序列化也支持擴展。
(十四)dubbo-test——測試模塊

這個模塊封裝了針對dubbo的性能測試、兼容性測試等功能。

看看test的目錄:

dubbo-test

  1. dubbo-test-benchmark:對性能的測試。
  2. dubbo-test-compatibility:對兼容性的測試,對spring3對兼容性測試。
  3. dubbo-test-examples:測試所使用的示例。
  4. dubbo-test-integration:測試所需的pom文件

下面我來說講dubbo中Maven相關的pom文件

  1. dubbo-bom/pom.xml,利用Maven BOM統必定義了dubbo的版本號。dubbo-test和dubbo-demo的pom文件中都會引用dubbo-bom/pom.xml,以dubbo-demo都pom舉例子:

    dubbo-demo引入bom

  2. dubbo-dependencies-bom/pom.xml:利用Maven BOM統必定義了dubbo依賴的第三方庫的版本號。dubbo-parent會引入該bom:

    dubbo-parent依賴第三方庫

  3. all/pow.xml:定義了dubbo的打包腳本,使用dubbo庫的時候,須要引入改pom文件。
  4. dubbo-parent:是dubbo的父pom,dubbo的maven模塊都會引入該pom文件。

後記

讀完整篇文章後不知道對你踏入dubbo源碼解讀是否有幾分幫助,後續我將會逐步更新dubbo每一個模塊的解讀,若是我在哪一部分寫的不夠到位或者寫錯了,歡迎給我提意見,個人私人微信號碼:HUA799695226。

相關文章
相關標籤/搜索