Dubbo是什么
Dubbo是阿里SOA服務(wù)化治理方案的核心框架矢洲,是眾多RPC框架中卓越的框架之一读虏,它提供了注冊(cè)中心機(jī)制袁滥,解耦了消費(fèi)方和服務(wù)方動(dòng)態(tài)發(fā)現(xiàn)的問題,并提高了可靠能力呻拌。我們可以通過官方的架構(gòu)圖了解下Dubbo的工作機(jī)制和工作原理:
架構(gòu)圖中幾個(gè)主要的角色如下:
Container:服務(wù)運(yùn)行的容器
Provider:暴露服務(wù)的服務(wù)提供方
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)者
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
幾個(gè)角色協(xié)調(diào)運(yùn)作的過程:
Provider啟動(dòng)時(shí)會(huì)向注冊(cè)中心吧自己的元數(shù)據(jù)信息注冊(cè)上去(例如服務(wù)IP地址和端口號(hào)等)藐握,Consumer啟動(dòng)時(shí)會(huì)從注冊(cè)中心訂閱(第一次訂閱會(huì)拉取全量數(shù)據(jù))服務(wù)提供方的元數(shù)據(jù),
注冊(cè)中心發(fā)生數(shù)據(jù)變更時(shí)會(huì)將變更的數(shù)據(jù)推送給訂閱的Consumer袜炕。Consumer在獲取到元數(shù)據(jù)之后初家,可以發(fā)起RPC調(diào)用乌助,在RPC調(diào)用前后會(huì)向監(jiān)控中心上報(bào)統(tǒng)計(jì)信息(調(diào)用的接口以及并發(fā)數(shù)等信息)陌知。
Dubbo核心組件及整體調(diào)用過程
Dubbo框架的核心組件
Dubbo中體的分層主要可以分為業(yè)務(wù)層、RPC層和Remot層赏参,如果把每層進(jìn)行詳細(xì)劃分的話整體又可以分為以下幾層:
業(yè)務(wù)層:
service層:包括業(yè)務(wù)代碼的接口與實(shí)現(xiàn)沿盅,即開發(fā)者實(shí)現(xiàn)的業(yè)務(wù)代碼
RPC層:
config:配置層,主要圍繞ServiceConfig(暴露的服務(wù)配置)和ReferenceConfig(引用的服務(wù)配置)兩個(gè)類展開腰涧,初始化配置信息。
proxy:服務(wù)代理層疗锐,無論是生產(chǎn)者還是消費(fèi)者万伤,Dubbo都會(huì)生成一個(gè)代理類,這樣當(dāng)調(diào)用一個(gè)遠(yuǎn)程接口 時(shí)敌买,就像調(diào)用本地接口一樣阶界,代理層會(huì)自動(dòng)做遠(yuǎn)程調(diào)用并返回結(jié)果。
registry:注冊(cè)層芙粱,負(fù)責(zé)Dubbo框架的服務(wù)注冊(cè)與發(fā)現(xiàn)氧映。
cluster:集群容錯(cuò)層,主要負(fù)責(zé)遠(yuǎn)程調(diào)用失敗時(shí)的集群容錯(cuò)策略(如快速失敗律姨、失敗重試等)臼疫。
monitor:監(jiān)控層,負(fù)責(zé)監(jiān)控統(tǒng)計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間等烫堤。
protocol:遠(yuǎn)程調(diào)用層凤价,封裝PRC調(diào)用的具體過程拔创,是Invoker暴露和引用的主要功能入口,負(fù)責(zé)管理Invoker的整個(gè)而聲名周期慢逾。
Remot層:
exchange:信息交換層躏吊,封裝請(qǐng)求響應(yīng)模式,如把同步請(qǐng)求轉(zhuǎn)換為異步請(qǐng)求胜卤。
transport:網(wǎng)絡(luò)傳輸層赁项,把網(wǎng)絡(luò)傳輸抽象為統(tǒng)一的接口。
Serialize:序列化層悠菜,將需要網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)極性序列化,轉(zhuǎn)換成二進(jìn)制流摩窃。
Dubbo服務(wù)的具體調(diào)用過程
Dubbo服務(wù)的具體調(diào)用過程如上圖所示芬骄,從生產(chǎn)者(服務(wù)提供者)暴露自己的服務(wù)和消費(fèi)者(服務(wù)調(diào)用者)調(diào)用遠(yuǎn)程服務(wù)兩個(gè)過程進(jìn)行大致的分析:
服務(wù)暴露大致過程
1、服務(wù)提供者在啟動(dòng)框架式蒂秘,初始化服務(wù)實(shí)例淘太。
2、通過Proxy組件調(diào)用具體協(xié)議(Dubbo支持多種協(xié)議)蒲牧。
3、服務(wù)端把暴露的接口封裝成Invoker显熏,然后轉(zhuǎn)換成Exporter晒屎。
4缓升、通過Registry把服務(wù)元數(shù)據(jù)注冊(cè)到注冊(cè)中心蕴轨。
消費(fèi)者調(diào)用服務(wù)的大致過程
1、從Proxy開始歧寺,Proxy持有Invoker對(duì)象棘脐,然后觸發(fā)invoke調(diào)用。
2蛀缝、在invoke調(diào)用過程中,需要使用到cluster容錯(cuò)策略嗤练,來負(fù)責(zé)調(diào)用遠(yuǎn)程服務(wù)失敗后的一些后續(xù)操作在讶。
3、Cluster在調(diào)用之前會(huì)通過Directory獲取所有可以調(diào)用的Invoker列表并且根據(jù)路由規(guī)則過濾一遍构哺。
4、經(jīng)過過濾之后的Invoker可能不止一個(gè)蝗碎,此時(shí)通過LoadBaklance負(fù)載均衡策略選出一個(gè)最終調(diào)用的Invoker旗扑。
5慈省、經(jīng)過網(wǎng)絡(luò)序列化以及傳輸將數(shù)據(jù)包送到服務(wù)提供者。
6袱衷、調(diào)用者的request被分配到線程池進(jìn)行處理笑窜,找到對(duì)應(yīng)的Exporter,經(jīng)過一系列的Filter之后得具體接口的真是實(shí)現(xiàn)并調(diào)用排截。
7辐益、調(diào)用完成之后將結(jié)果原路返回脱吱。
需要重點(diǎn)理解和掌握的核心組件
Dubbo眾多的模塊中,可能在開發(fā)過程當(dāng)中并不會(huì)全部都用到续捂,但是有幾個(gè)模塊需要重點(diǎn)掌握宦搬,
1、Dubbo的注冊(cè)中心矾克,包括注冊(cè)中心的工作流程撇簿、注冊(cè)中心的數(shù)據(jù)結(jié)構(gòu),訂閱發(fā)布實(shí)現(xiàn)的原理等四瘫。
2、Dubbo服務(wù)的啟停原理饼暑,包括生產(chǎn)者對(duì)外暴露自己服務(wù)接口的詳細(xì)過程以及消費(fèi)者調(diào)用遠(yuǎn)程接口的詳細(xì)過程洗做。
3、Dubbo的遠(yuǎn)程調(diào)用過程撰筷,包括Dubbo核心調(diào)用流程畦徘,Dubbo使用的協(xié)議以及線程模型等。
4井辆、Dubbo的集群容錯(cuò)策略,包括Directory的實(shí)現(xiàn)原理蒸播,Router的實(shí)現(xiàn)原理以及LoadBalance的實(shí)現(xiàn)原理等萍肆。
Dubbo系列博客將以最新版本源碼為基礎(chǔ)進(jìn)行分析和學(xué)習(xí)胀屿,源碼下載地址 蜡塌,分支選擇master即可選擇最新版進(jìn)行下載。
我是割草的小豬頭劳曹,不斷學(xué)習(xí)琅摩,不斷進(jìn)步,后續(xù)陸續(xù)更新Dubbo系列的文章房资,如您有興趣一起了解,歡迎關(guān)注岖沛,如文章中有不妥之處搭独,歡迎指正!