1. 程式人生 > 程式設計 >Dubbo原始碼解析(一)Hello,Dubbo

Dubbo原始碼解析(一)Hello,Dubbo

Hello,Dubbo

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

Dubbo你到底是什麼?

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

那麼什麼是RPC?

檔案:dubbo.apache.org/zh-cn/docs/…

​ 檔案簡短形象的對單一應用架構、垂直應用架構、分散式服務架構、流動計算架構做了一個對比,可以很明白的看出這四個架構所適用的場景,因為業務需求越來越複雜,才會有這一系列的演變。

​ RPC英文全名為Remote Procedure Call,也叫遠端過程呼叫,其實就是一個計算機通訊協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。計算機通訊協議有很多種,對於開發來說,很多熟悉的是HTTP協議,我這裡就做個簡單的比較,HTTP協議是屬於應用層的,而RPC跨越了傳輸層和應用層。HTTP本身的三次握手協議,每傳送一次請求,都會有一次建立連線的過程,就會帶來一定的延遲,並且HTTP本身的報文龐大,而RPC可以按需連線,呼叫結束後就斷掉,也可以是長連結,多個遠端過程呼叫共享同一個連結,可以看出來RPC的效率要高於HTTP,但是相對於開發簡單快速的HTTP服務,RPC服務就會顯得複雜一些。

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

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

github地址:github.com/apache/incu…

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

dubbo框架設計介紹

​ dubbo的官方檔案真的寫的太好了,我在這裡還是要誇讚一下。接下來我對整個框架設計的介紹是基於官方檔案的基礎上進行擴充,儘量做到更加通俗易懂。

​ 我們先來看看把原始碼clone下來後的結構:

dubbo工程結構

​ 可以看到Dubbo被拆分成很多的Maven專案(右邊的我還沒有截全)。

如果看過dubbo官方檔案的朋友肯定看到過以下這個圖

dubbo-modules

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

​ 先來講講上圖的幾個模組:

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

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

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

看看registry目錄結構:

註冊中心的目錄

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

官方檔案的解釋:將多個服務提供方偽裝為一個提供方,包括:負載均衡,容錯,路由等,叢集的地址列表可以是靜態配置的,也可以是由註冊中心下發。

cluster

我的理解:它就是一個解決出錯情況採用的策略,這個模組裡面封裝了多種策略的實現方法,並且也支援自己擴充套件叢集容錯策略,cluster把多個Invoker偽裝成一個Invoker,並且在偽裝過程中加入了容錯邏輯,失敗了,重試下一個。

看看cluster的目錄結構:

cluster目錄

  1. configurator包:配置包,dubbo的基本設計原則是採用URL作為配置資訊的統一格式,所有拓展點都通過傳遞URL攜帶配置資訊,這個包就是用來根據統一的配置規則生成配置資訊。
  2. directory包:封裝了把Invoker偽裝成一個Invoker的方法,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的目錄:

common目錄

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

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

官方檔案的解釋:是 Dubbo 對外的 API,使用者通過 Config 使用Dubbo,隱藏 Dubbo 所有細節。

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

看看config的目錄:

config目錄

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

官方檔案的解釋:抽象各種協議,以及動態代理,只包含一對一的呼叫,不關心叢集的管理。

我的理解:遠端呼叫,最主要的肯定是協議,dubbo提供了許許多多的協議實現,不過官方推薦時使用dubbo自己的協議,還給出了一份效能測試報告。

效能測試報告地址:dubbo.apache.org/zh-cn/docs/…

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

看看rpc的目錄:

rpc目錄

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

官方檔案的解釋:相當於 Dubbo 協議的實現,如果 RPC 用 RMI協議則不需要使用此包。

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

看看remoting的目錄:

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的目錄:

container目錄

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

官方檔案的解釋:統計服務呼叫次數,呼叫時間的,呼叫鏈跟蹤的服務。

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

看看monitor的目錄:

monitor目錄

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

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

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

這個模組是快速啟動示例,其中包含了服務提供方和呼叫方,註冊中心用的是multicast,用XML配置方法,具體的介紹可以看官方檔案。

示例介紹地址:dubbo.apache.org/zh-cn/docs/…

(十一)dubbo-filter——過濾器模組

這個模組提供了內建的一些過濾器。

看看filter的目錄:

filter目錄

  1. dubbo-filter-cache:提供快取過濾器。
  2. dubbo-filter-validation:提供引數驗證過濾器。
(十二)dubbo-plugin——外掛模組

該模組提供了內建的外掛。

看看plugin的目錄:

plugin目錄

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

該模組中封裝了各類序列化框架的支援實現。

看看serialization的目錄:

serialization目錄

  1. dubbo-serialization-api:定義了Serialization的介面以及資料輸入輸出的介面。
  2. 其他的包都是實現了對應的序列化框架的方法。dubbo內建的就是這幾類的序列化框架,序列化也支援擴充套件。
(十四)dubbo-test——測試模組

這個模組封裝了針對dubbo的效能測試、相容性測試等功能。

看看test的目錄:

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檔案。