Dubbo是什么
Dubbo是阿里SOA服務(wù)化治理方案的核心框架,是眾多RPC框架中卓越的框架之一,它提供了注冊中心機(jī)制,解耦了消費方和服務(wù)方動態(tài)發(fā)現(xiàn)的問題,并提高了可靠能力。我們可以通過官方的架構(gòu)圖了解下Dubbo的工作機(jī)制和工作原理:

架構(gòu)圖中幾個主要的角色如下:
Container:服務(wù)運行的容器
Provider:暴露服務(wù)的服務(wù)提供方
Registry: 服務(wù)注冊與發(fā)現(xiàn)的注冊中心
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費者
Monitor: 統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心
幾個角色協(xié)調(diào)運作的過程:
Provider啟動時會向注冊中心吧自己的元數(shù)據(jù)信息注冊上去(例如服務(wù)IP地址和端口號等),Consumer啟動時會從注冊中心訂閱(第一次訂閱會拉取全量數(shù)據(jù))服務(wù)提供方的元數(shù)據(jù),
注冊中心發(fā)生數(shù)據(jù)變更時會將變更的數(shù)據(jù)推送給訂閱的Consumer。Consumer在獲取到元數(shù)據(jù)之后,可以發(fā)起RPC調(diào)用,在RPC調(diào)用前后會向監(jiān)控中心上報統(tǒng)計信息(調(diào)用的接口以及并發(fā)數(shù)等信息)。
Dubbo核心組件及整體調(diào)用過程
Dubbo框架的核心組件

Dubbo中體的分層主要可以分為業(yè)務(wù)層、RPC層和Remot層,如果把每層進(jìn)行詳細(xì)劃分的話整體又可以分為以下幾層:
業(yè)務(wù)層:
service層:包括業(yè)務(wù)代碼的接口與實現(xiàn),即開發(fā)者實現(xiàn)的業(yè)務(wù)代碼
RPC層:
config:配置層,主要圍繞ServiceConfig(暴露的服務(wù)配置)和ReferenceConfig(引用的服務(wù)配置)兩個類展開,初始化配置信息。
proxy:服務(wù)代理層,無論是生產(chǎn)者還是消費者,Dubbo都會生成一個代理類,這樣當(dāng)調(diào)用一個遠(yuǎn)程接口 時,就像調(diào)用本地接口一樣,代理層會自動做遠(yuǎn)程調(diào)用并返回結(jié)果。
registry:注冊層,負(fù)責(zé)Dubbo框架的服務(wù)注冊與發(fā)現(xiàn)。
cluster:集群容錯層,主要負(fù)責(zé)遠(yuǎn)程調(diào)用失敗時的集群容錯策略(如快速失敗、失敗重試等)。
monitor:監(jiān)控層,負(fù)責(zé)監(jiān)控統(tǒng)計調(diào)用次數(shù)和調(diào)用時間等。
protocol:遠(yuǎn)程調(diào)用層,封裝PRC調(diào)用的具體過程,是Invoker暴露和引用的主要功能入口,負(fù)責(zé)管理Invoker的整個而聲名周期。
Remot層:
exchange:信息交換層,封裝請求響應(yīng)模式,如把同步請求轉(zhuǎn)換為異步請求。
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ù)和消費者(服務(wù)調(diào)用者)調(diào)用遠(yuǎn)程服務(wù)兩個過程進(jìn)行大致的分析:
服務(wù)暴露大致過程
1、服務(wù)提供者在啟動框架式,初始化服務(wù)實例。
2、通過Proxy組件調(diào)用具體協(xié)議(Dubbo支持多種協(xié)議)。
3、服務(wù)端把暴露的接口封裝成Invoker,然后轉(zhuǎn)換成Exporter。
4、通過Registry把服務(wù)元數(shù)據(jù)注冊到注冊中心。
消費者調(diào)用服務(wù)的大致過程
1、從Proxy開始,Proxy持有Invoker對象,然后觸發(fā)invoke調(diào)用。
2、在invoke調(diào)用過程中,需要使用到cluster容錯策略,來負(fù)責(zé)調(diào)用遠(yuǎn)程服務(wù)失敗后的一些后續(xù)操作。
3、Cluster在調(diào)用之前會通過Directory獲取所有可以調(diào)用的Invoker列表并且根據(jù)路由規(guī)則過濾一遍。
4、經(jīng)過過濾之后的Invoker可能不止一個,此時通過LoadBaklance負(fù)載均衡策略選出一個最終調(diào)用的Invoker。
5、經(jīng)過網(wǎng)絡(luò)序列化以及傳輸將數(shù)據(jù)包送到服務(wù)提供者。
6、調(diào)用者的request被分配到線程池進(jìn)行處理,找到對應(yīng)的Exporter,經(jīng)過一系列的Filter之后得具體接口的真是實現(xiàn)并調(diào)用。
7、調(diào)用完成之后將結(jié)果原路返回。
需要重點理解和掌握的核心組件
Dubbo眾多的模塊中,可能在開發(fā)過程當(dāng)中并不會全部都用到,但是有幾個模塊需要重點掌握,
1、Dubbo的注冊中心,包括注冊中心的工作流程、注冊中心的數(shù)據(jù)結(jié)構(gòu),訂閱發(fā)布實現(xiàn)的原理等。
2、Dubbo服務(wù)的啟停原理,包括生產(chǎn)者對外暴露自己服務(wù)接口的詳細(xì)過程以及消費者調(diào)用遠(yuǎn)程接口的詳細(xì)過程。
3、Dubbo的遠(yuǎn)程調(diào)用過程,包括Dubbo核心調(diào)用流程,Dubbo使用的協(xié)議以及線程模型等。
4、Dubbo的集群容錯策略,包括Directory的實現(xiàn)原理,Router的實現(xiàn)原理以及LoadBalance的實現(xiàn)原理等。
Dubbo系列博客將以最新版本源碼為基礎(chǔ)進(jìn)行分析和學(xué)習(xí),源碼下載地址 ,分支選擇master即可選擇最新版進(jìn)行下載。
我是割草的小豬頭,不斷學(xué)習(xí),不斷進(jìn)步,后續(xù)陸續(xù)更新Dubbo系列的文章,如您有興趣一起了解,歡迎關(guān)注,如文章中有不妥之處,歡迎指正!