最近一直在看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的協議都要用到此模塊
- dubbo-remoting-api:定義了客戶端和服務端的連接
- dubbo-remoting-grizzly;基於grizzly實現的service和client
- dubbo-remoting-http;基於Jetty或Tomcat實現的Client和Server。
- dubbo-remoting-mina;基於Mina實現的Client和Server。
- dubbo-remoting-netty4;基於Netty4實現的Client和Server
- dubbo-remoting-p2p; P2P服務器,註冊中心multicast中會用到這個服務器使用
- 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模塊,抽象了各類的協議。
- dubbo-rpc-api 抽象了動態代理的各種協議,實現了一對一的調用
- 包都是各種協議的實現
4.4.4dubbo-cluster:集羣模塊
將多個服務提供方僞裝爲一個提供方,包括,負載均衡,容錯,路由等,集羣的地址列表可以是靜態配置,也可以是註冊中心下發,
自己的理解爲:這個是一個解決出錯情況的採用的策略,這個模塊裏封裝了多個策略的實現方法。並且也支持自己擴展集羣容錯策略,cluster把多個Invoker僞裝成一個Invoker,並且在僞裝的過程中加入了容錯邏輯,失敗了重試下一個!
如下圖dubbo-cluster 目錄結構
- configurator包:配置包,dubbo的基本設計原理都是採用url作爲配置信息的統一格式,所有拓展點都通過傳遞URL攜帶配置信息,這個包就是更具統一配置規則生成配置信息
- directory包;Directory代表了多個Invoker,並且它的值會隨着註冊中心的服務變更推送而變化,這裏介紹下Invoker,Invoker是Provider的一個調用Service的抽象,Invoker封裝了Provider地址以及Service接口信息。
- loadbalance包;封裝了負載均衡的實現,負責利用負載均衡算法,從多個Invoker中選出具體的一個Invoker用於此次的調用,如果調用失敗,則需要重新選擇。
- merger包:封裝了合併返回結果,分組聚合到方法,支持多種數據結構類型。
- router包:封裝了路由規則的實現,路由規則決定了一次dubbo服務調用的目標服務器,路由規則分兩種:條件路由規則和腳本路由規則,並且支持可拓展。
- support包:封裝了各類Invoker和cluster,包括集羣容錯模式和分組聚合的cluster以及相關的Invoker。
- governance包:spi 擴展服務治理包
- 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配置,註解配置,配置模塊就是實現了這四種配置
- dubbo-config-api 實現了api配置和屬性配置的功能
- dubbo-config-spring 實現了xml配置和註解配置
4.4.8 dubbo-container 容器模塊
官方;是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啓動,,因爲服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務.(這個是重點,記住,要考的!!)
個人理解:因爲後臺不需要tomcat/joboss等容器的功能,不需要用這些厚重的容器去加載服務的提供方,既浪費資源,又增加了複雜度,服務容器只是一個簡單的main方法,加載一些內置容器,也支持擴展容器
- dubbo-container-api:定義了Container接口,實現了服務加載的Main方法。
- 其他三個分別提供了對應的容器,供Main方法加載
4.4.9 dubbo-demo 示例模塊
這個模塊示快速啓動示例,包含了服務提供和服務調用,註冊中心示multicast,調用方式是xml 具體比較簡單,可以參見官方文檔
http://dubbo.apache.org/zh-cn/docs/user/quick-start.html
4.4.10 dubbo-filter 過濾器模塊
這個模塊提供了內置的一些過濾器
- dubbo-filter-cache 提供緩存過濾器
- 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