摘要:英文全名為,也叫遠(yuǎn)程過程調(diào)用,其實(shí)就是一個(gè)計(jì)算機(jī)通信協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù)而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。
Hello,Dubbo
你好,dubbo,初次見面,我想和你交個(gè)朋友。
Dubbo你到底是什么?先給出一套官方的說法:Apache Dubbo是一款高性能、輕量級(jí)基于Java的RPC開源框架。
文檔地址:http://dubbo.apache.org/zh-cn...
文檔簡(jiǎn)短形象的對(duì)單一應(yīng)用架構(gòu)、垂直應(yīng)用架構(gòu)、分布式服務(wù)架構(gòu)、流動(dòng)計(jì)算架構(gòu)做了一個(gè)對(duì)比,可以很明白的看出這四個(gè)架構(gòu)所適用的場(chǎng)景,因?yàn)闃I(yè)務(wù)需求越來越復(fù)雜,才會(huì)有這一系列的演變。
RPC英文全名為Remote Procedure Call,也叫遠(yuǎn)程過程調(diào)用,其實(shí)就是一個(gè)計(jì)算機(jī)通信協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。計(jì)算機(jī)通信協(xié)議有很多種,對(duì)于開發(fā)來說,很多熟悉的是HTTP協(xié)議,我這里就做個(gè)簡(jiǎn)單的比較,HTTP協(xié)議是屬于應(yīng)用層的,而RPC跨越了傳輸層和應(yīng)用層。HTTP本身的三次握手協(xié)議,每發(fā)送一次請(qǐng)求,都會(huì)有一次建立連接的過程,就會(huì)帶來一定的延遲,并且HTTP本身的報(bào)文龐大,而RPC可以按需連接,調(diào)用結(jié)束后就斷掉,也可以是長(zhǎng)鏈接,多個(gè)遠(yuǎn)程過程調(diào)用共享同一個(gè)鏈接,可以看出來RPC的效率要高于HTTP,但是相對(duì)于開發(fā)簡(jiǎn)單快速的HTTP服務(wù),RPC服務(wù)就會(huì)顯得復(fù)雜一些。
回到原先的話題,繼續(xù)來聊聊dubbo。關(guān)于dubbo 的特點(diǎn)分別有連通性、健壯性、伸縮性、以及向未來架構(gòu)的升級(jí)性。特點(diǎn)的詳細(xì)介紹也可以參考上述鏈接的官方文檔。官方文檔擁有的內(nèi)容我在這就不一一進(jìn)行闡述了。
因?yàn)榻酉聛硇枰獙?duì)dubbo各個(gè)模塊的源碼以及原理進(jìn)行解析,所以介紹一下dubbo的源碼庫,dubbo框架已經(jīng)交由Apache基金會(huì)進(jìn)行孵化,被掛在github開源。
github地址:https://github.com/apache/inc...
然后講一下dubbo的版本策略:兩個(gè)大版本并行發(fā)展,2.5.x是穩(wěn)定版本,2.6.x是新功能實(shí)驗(yàn)版本。2.6上實(shí)驗(yàn)都穩(wěn)定了以后,會(huì)遷移到2.5,所以如果你想了解dubbo最新的牛逼特性,就選擇2.6,否則用2.5版本。我接下來介紹都是基于2.6.x版本。
dubbo框架設(shè)計(jì)介紹dubbo的官方文檔真的寫的太好了,我在這里還是要夸贊一下。接下來我對(duì)整個(gè)框架設(shè)計(jì)的介紹是基于官方文檔的基礎(chǔ)上進(jìn)行擴(kuò)充,盡量做到更加通俗易懂。
可以看到Dubbo被拆分成很多的Maven項(xiàng)目(右邊的我還沒有截全)接下來我會(huì)介紹左邊每個(gè)模塊的大致作用。
如果看過dubbo官方文檔的朋友肯定看到過以下這個(gè)圖:
?從以上這個(gè)圖我們可以清晰的看到各個(gè)模塊之間依賴關(guān)系,其實(shí)以上的圖只是展示了關(guān)鍵的模塊依賴關(guān)系,還有部分模塊比如dubbo-bootstrap清理模塊等,下面我會(huì)對(duì)各個(gè)模塊做個(gè)簡(jiǎn)單的介紹,至少弄明白各個(gè)模塊的作用。
?先來講講上圖的幾個(gè)模塊:
官方文檔的解釋:基于注冊(cè)中心下發(fā)地址的集群方式,以及對(duì)各種注冊(cè)中心的抽象。
我的理解是:dubbo的注冊(cè)中心實(shí)現(xiàn)有Multicast注冊(cè)中心、Zookeeper注冊(cè)中心、Redis注冊(cè)中心、Simple注冊(cè)中心(具體怎么實(shí)現(xiàn)我在后面文章中會(huì)介紹),這個(gè)模塊就是封裝了dubbo所支持的注冊(cè)中心的實(shí)現(xiàn)。
看看registry目錄結(jié)構(gòu):
dubbo-registry-api:抽象了注冊(cè)中心的注冊(cè)和發(fā)現(xiàn),實(shí)現(xiàn)了一些公用的方法,讓子類只關(guān)注部分關(guān)鍵方法。
以下四個(gè)包是分別是四種注冊(cè)中心實(shí)現(xiàn)方法的封裝,其中dubbo-registry-default就是官方文檔里面的Simple注冊(cè)中心。
官方文檔的解釋:將多個(gè)服務(wù)提供方偽裝為一個(gè)提供方,包括:負(fù)載均衡, 容錯(cuò),路由等,集群的地址列表可以是靜態(tài)配置的,也可以是由注冊(cè)中心下發(fā)。
我的理解:它就是一個(gè)解決出錯(cuò)情況采用的策略,這個(gè)模塊里面封裝了多種策略的實(shí)現(xiàn)方法,并且也支持自己擴(kuò)展集群容錯(cuò)策略,cluster把多個(gè)Invoker偽裝成一個(gè)Invoker,并且在偽裝過程中加入了容錯(cuò)邏輯,失敗了,重試下一個(gè)。
看看cluster的目錄結(jié)構(gòu):
configurator包:配置包,dubbo的基本設(shè)計(jì)原則是采用URL作為配置信息的統(tǒng)一格式,所有拓展點(diǎn)都通過傳遞URL攜帶配置信息,這個(gè)包就是用來根據(jù)統(tǒng)一的配置規(guī)則生成配置信息。
directory包:Directory 代表了多個(gè) Invoker,并且它的值會(huì)隨著注冊(cè)中心的服務(wù)變更推送而變化 。這里介紹一下Invoker,Invoker是Provider的一個(gè)調(diào)用Service的抽象,Invoker封裝了Provider地址以及Service接口信息。
loadbalance包:封裝了負(fù)載均衡的實(shí)現(xiàn),負(fù)責(zé)利用負(fù)載均衡算法從多個(gè)Invoker中選出具體的一個(gè)Invoker用于此次的調(diào)用,如果調(diào)用失敗,則需要重新選擇。
merger包:封裝了合并返回結(jié)果,分組聚合到方法,支持多種數(shù)據(jù)結(jié)構(gòu)類型。
router包:封裝了路由規(guī)則的實(shí)現(xiàn),路由規(guī)則決定了一次dubbo服務(wù)調(diào)用的目標(biāo)服務(wù)器,路由規(guī)則分兩種:條件路由規(guī)則和腳本路由規(guī)則,并且支持可拓展。
support包:封裝了各類Invoker和cluster,包括集群容錯(cuò)模式和分組聚合的cluster以及相關(guān)的Invoker。
官方文檔的解釋:包括 Util 類和通用模型。
我的理解:這個(gè)應(yīng)該很通俗易懂,工具類就是一些公用的方法,通用模型就是貫穿整個(gè)項(xiàng)目的統(tǒng)一格式的模型,比如URL,上述就提到了URL貫穿了整個(gè)項(xiàng)目。
看看common的目錄:
這個(gè)類中的包含義我就不一一講了,具體的介紹會(huì)穿插在后續(xù)文章中,因?yàn)檫@些都是工具類的一些實(shí)現(xiàn),包的含義也很明顯。
官方文檔的解釋:是 Dubbo 對(duì)外的 API,用戶通過 Config 使用Dubbo,隱藏 Dubbo 所有細(xì)節(jié)。
我的理解:用戶都是使用配置來使用dubbo,dubbo也提供了四種配置方式,包括XML配置、屬性配置、API配置、注解配置,配置模塊就是實(shí)現(xiàn)了這四種配置的功能。
看看config的目錄:
dubbo-config-api:實(shí)現(xiàn)了API配置和屬性配置的功能。
dubbo-config-spring:實(shí)現(xiàn)了XML配置和注解配置的功能。
官方文檔的解釋:抽象各種協(xié)議,以及動(dòng)態(tài)代理,只包含一對(duì)一的調(diào)用,不關(guān)心集群的管理。
我的理解:遠(yuǎn)程調(diào)用,最主要的肯定是協(xié)議,dubbo提供了許許多多的協(xié)議實(shí)現(xiàn),不過官方推薦時(shí)使用dubbo自己的協(xié)議,還給出了一份性能測(cè)試報(bào)告。
性能測(cè)試報(bào)告地址:http://dubbo.apache.org/zh-cn...
這個(gè)模塊依賴于dubbo-remoting模塊,抽象了各類的協(xié)議。
看看rpc的目錄:
dubbo-rpc-api:抽象了動(dòng)態(tài)代理和各類協(xié)議,實(shí)現(xiàn)一對(duì)一的調(diào)用
另外的包都是各個(gè)協(xié)議的實(shí)現(xiàn)。
官方文檔的解釋:相當(dāng)于 Dubbo 協(xié)議的實(shí)現(xiàn),如果 RPC 用 RMI協(xié)議則不需要使用此包。
我的理解:提供了多種客戶端和服務(wù)端通信功能,比如基于Grizzly、Netty、Tomcat等等,RPC用除了RMI的協(xié)議都要用到此模塊。
看看remoting的目錄:
dubbo-remoting-api:定義了客戶端和服務(wù)端的接口。
dubbo-remoting-grizzly:基于Grizzly實(shí)現(xiàn)的Client和Server。
dubbo-remoting-http:基于Jetty或Tomcat實(shí)現(xiàn)的Client和Server。
dubbo-remoting-mina:基于Mina實(shí)現(xiàn)的Client和Server。
dubbo-remoting-netty:基于Netty3實(shí)現(xiàn)的Client和Server。
Dubbo-remoting-netty4:基于Netty4實(shí)現(xiàn)的Client和Server。
dubbo-remoting-p2p:P2P服務(wù)器,注冊(cè)中心multicast中會(huì)用到這個(gè)服務(wù)器使用。
dubbo-remoting-zookeeper:封裝了Zookeeper Client ,和 Zookeeper Server 通信。
官方文檔的解釋:是一個(gè) Standlone 的容器,以簡(jiǎn)單的 Main 加載 Spring 啟動(dòng),因?yàn)榉?wù)通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務(wù)。
我的理解:因?yàn)楹笈_(tái)服務(wù)不需要Tomcat/JBoss 等 Web 容器的功能,不需要用這些厚實(shí)的容器去加載服務(wù)提供方,既資源浪費(fèi),又增加復(fù)雜度。服務(wù)容器只是一個(gè)簡(jiǎn)單的Main方法,加載一些內(nèi)置的容器,也支持?jǐn)U展容器。
看看container的目錄:
dubbo-container-api:定義了Container接口,實(shí)現(xiàn)了服務(wù)加載的Main方法。
其他三個(gè)分別提供了對(duì)應(yīng)的容器,供Main方法加載。
官方文檔的解釋:統(tǒng)計(jì)服務(wù)調(diào)用次數(shù),調(diào)用時(shí)間的,調(diào)用鏈跟蹤的服務(wù)。
我的理解:這個(gè)模塊很清楚,就是對(duì)服務(wù)的監(jiān)控。
看看monitor的目錄:
dubbo-monitor-api:定義了monitor相關(guān)的接口,實(shí)現(xiàn)了監(jiān)控所需要的過濾器。
dubbo-monitor-default:實(shí)現(xiàn)了dubbo監(jiān)控相關(guān)的功能。
這個(gè)模塊只有一個(gè)類,是作為dubbo的引導(dǎo)類,并且在停止期間進(jìn)行清理資源。具體的介紹我在后續(xù)文章中講解。
這個(gè)模塊是快速啟動(dòng)示例,其中包含了服務(wù)提供方和調(diào)用方,注冊(cè)中心用的是multicast,用XML配置方法,具體的介紹可以看官方文檔。
示例介紹地址:http://dubbo.apache.org/zh-cn...
這個(gè)模塊提供了內(nèi)置的一些過濾器。
看看filter的目錄:
dubbo-filter-cache:提供緩存過濾器。
dubbo-filter-validation:提供參數(shù)驗(yàn)證過濾器。
該模塊提供了內(nèi)置的插件。
看看plugin的目錄:
dubbo-qos:提供了在線運(yùn)維的命令。
該模塊中封裝了各類序列化框架的支持實(shí)現(xiàn)。
看看serialization的目錄:
dubbo-serialization-api:定義了Serialization的接口以及數(shù)據(jù)輸入輸出的接口。
其他的包都是實(shí)現(xiàn)了對(duì)應(yīng)的序列化框架的方法。dubbo內(nèi)置的就是這幾類的序列化框架,序列化也支持?jǐn)U展。
這個(gè)模塊封裝了針對(duì)dubbo的性能測(cè)試、兼容性測(cè)試等功能。
看看test的目錄:
dubbo-test-benchmark:對(duì)性能的測(cè)試。
dubbo-test-compatibility:對(duì)兼容性的測(cè)試,對(duì)spring3對(duì)兼容性測(cè)試。
dubbo-test-examples:測(cè)試所使用的示例。
dubbo-test-integration:測(cè)試所需的pom文件
下面我來講講dubbo中Maven相關(guān)的pom文件dubbo-bom/pom.xml,利用Maven BOM統(tǒng)一定義了dubbo的版本號(hào)。dubbo-test和dubbo-demo的pom文件中都會(huì)引用dubbo-bom/pom.xml,以dubbo-demo都pom舉例子:
dubbo-dependencies-bom/pom.xml:利用Maven BOM統(tǒng)一定義了dubbo依賴的第三方庫的版本號(hào)。dubbo-parent會(huì)引入該bom:
all/pow.xml:定義了dubbo的打包腳本,使用dubbo庫的時(shí)候,需要引入改pom文件。
dubbo-parent:是dubbo的父pom,dubbo的maven模塊都會(huì)引入該pom文件。
后記讀完整篇文章后不知道對(duì)你踏入dubbo源碼解讀是否有幾分幫助,后續(xù)我將會(huì)逐步更新dubbo每個(gè)模塊的解讀,如果我在哪一部分寫的不夠到位或者寫錯(cuò)了,歡迎給我提意見,我的私人微信號(hào)碼:HUA799695226。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/71760.html
摘要:服務(wù)提供者代碼上面這個(gè)類會(huì)被封裝成為一個(gè)實(shí)例,并新生成一個(gè)實(shí)例。這樣當(dāng)網(wǎng)絡(luò)通訊層收到一個(gè)請(qǐng)求后,會(huì)找到對(duì)應(yīng)的實(shí)例,并調(diào)用它所對(duì)應(yīng)的實(shí)例,從而真正調(diào)用了服務(wù)提供者的代碼。 這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進(jìn)行源碼學(xué)習(xí)。總結(jié)起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構(gòu)圖先畫出來.讓讀者拿著地圖跟著我的腳步,并且每一步我都提醒,現(xiàn)在我們?cè)谀?我們下一...
摘要:簡(jiǎn)介全稱為,是一種服務(wù)發(fā)現(xiàn)機(jī)制。的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中,并由服務(wù)加載器讀取配置文件,加載實(shí)現(xiàn)類。不過,并未使用原生的機(jī)制,而是對(duì)其進(jìn)行了增強(qiáng),使其能夠更好的滿足需求。并未使用,而是重新實(shí)現(xiàn)了一套功能更強(qiáng)的機(jī)制。 1、SPI簡(jiǎn)介 SPI 全稱為 Service Provider Interface,是一種服務(wù)發(fā)現(xiàn)機(jī)制。SPI 的本質(zhì)是將接口實(shí)現(xiàn)類的全限定名配置在文件中...
摘要:可以參考源碼解析二十四遠(yuǎn)程調(diào)用協(xié)議的八。十六的該類也是用了適配器模式,該類主要的作用就是增加了心跳功能,可以參考源碼解析十遠(yuǎn)程通信層的四。二十的可以參考源碼解析十七遠(yuǎn)程通信的一。 2.7大揭秘——消費(fèi)端發(fā)送請(qǐng)求過程 目標(biāo):從源碼的角度分析一個(gè)服務(wù)方法調(diào)用經(jīng)歷怎么樣的磨難以后到達(dá)服務(wù)端。 前言 前一篇文章講到的是引用服務(wù)的過程,引用服務(wù)無非就是創(chuàng)建出一個(gè)代理。供消費(fèi)者調(diào)用服務(wù)的相關(guān)方法。...
摘要:源碼分析條件路由規(guī)則有兩個(gè)條件組成,分別用于對(duì)服務(wù)消費(fèi)者和提供者進(jìn)行匹配。如果服務(wù)提供者匹配條件為空,表示對(duì)某些服務(wù)消費(fèi)者禁用服務(wù)。此時(shí)第六次循環(huán)分隔符,,。第二個(gè)和第三個(gè)參數(shù)來自方法的參數(shù)列表,這兩個(gè)參數(shù)分別為服務(wù)提供者和服務(wù)消費(fèi)者。 1. 簡(jiǎn)介 上一篇文章分析了集群容錯(cuò)的第一部分 -- 服務(wù)目錄 Directory。服務(wù)目錄在刷新 Invoker 列表的過程中,會(huì)通過 Router...
摘要:大揭秘目標(biāo)了解的新特性,以及版本升級(jí)的引導(dǎo)。四元數(shù)據(jù)改造我們知道以前的版本只有注冊(cè)中心,注冊(cè)中心的有數(shù)十個(gè)的鍵值對(duì),包含了一個(gè)服務(wù)所有的元數(shù)據(jù)。 DUBBO——2.7大揭秘 目標(biāo):了解2.7的新特性,以及版本升級(jí)的引導(dǎo)。 前言 我們知道Dubbo在2011年開源,停止更新了一段時(shí)間。在2017 年 9 月 7 日,Dubbo 悄悄的在 GitHub 發(fā)布了 2.5.4 版本。隨后,版本...
閱讀 529·2023-04-25 23:00
閱讀 3538·2021-11-22 13:54
閱讀 1962·2021-10-27 14:14
閱讀 1531·2019-08-30 13:59
閱讀 3568·2019-08-23 16:15
閱讀 2019·2019-08-23 16:06
閱讀 3403·2019-08-23 15:26
閱讀 1314·2019-08-23 13:48