Dubbo
官方文檔 link
是什么
- 一款分布式服務(wù)框架
- 高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案
- SOA服務(wù)治理方案
RPC
- Remote Procedure Call Protocol 遠(yuǎn)程過(guò)程調(diào)用
- A B兩臺(tái)服務(wù)器分別部署不同的應(yīng)用。當(dāng)A服務(wù)器需要調(diào)用B服務(wù)器上的方法,只能通過(guò)網(wǎng)絡(luò)來(lái)調(diào)用。所以就叫遠(yuǎn)程服務(wù)調(diào)用。
SOA - 面向服務(wù)框架
- 是一個(gè)組件模型,將不同應(yīng)用程序的不同功能單元通過(guò)服務(wù)之間定義良好的接口和契約聯(lián)系起來(lái)。
能干什么
- 透明化的遠(yuǎn)程方法調(diào)用。
- 就像調(diào)用本地方法一樣,簡(jiǎn)單配置,沒(méi)有任何api侵入
- 軟負(fù)載均衡及容錯(cuò)機(jī)制
- 服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)
- 不需要寫(xiě)死服務(wù)提供方地址。注冊(cè)中心基于接口名查詢服務(wù)提供者的ip地址,并且平滑的添加和刪除服務(wù)提供者。
架構(gòu)
image
- Provider 暴露服務(wù)的 服務(wù)提供方
- Consumer 調(diào)用遠(yuǎn)程服務(wù)的 服務(wù)消費(fèi)方
- Registry 服務(wù)注冊(cè)與發(fā)現(xiàn)的 注冊(cè)中心
- Monitor 統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的 監(jiān)控中心
調(diào)用流程
- 服務(wù)容易啟動(dòng)、加載,運(yùn)行服務(wù)提供者
- 服務(wù)提供者啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己要提供的服務(wù)
- 服務(wù)消費(fèi)者啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)
- 注冊(cè)中心返回提供者地址列表給消費(fèi)者。如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者
- 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果失敗,再選擇另一臺(tái)
- 消費(fèi)者和提供者,定時(shí)每分鐘發(fā)送調(diào)用次數(shù)和時(shí)間到監(jiān)控中心
底層實(shí)現(xiàn)
協(xié)議支持
- dubbo協(xié)議
- Hessian
- Http
- Rmi
- webservice
- Thrift
- Memcached
- redis
默認(rèn)使用dubbo協(xié)議
采用單一長(zhǎng)連接和NIO異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用。以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于提供者機(jī)器數(shù)的情況
使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。
支持的注冊(cè)中心
- Multicast
- Zookeeper
- Redis
- Simple
zookeeper注冊(cè)中心
Zookeeper是一個(gè)樹(shù)型的目錄服務(wù),支持變更推送

image
流程說(shuō)明:
- 服務(wù)提供者啟動(dòng)時(shí):
- 向/dubbo/com.foo.BarService/providers 目錄下寫(xiě)入自己的 URL 地址
- 服務(wù)消費(fèi)者啟動(dòng)時(shí):
- 訂閱../../providers下的url地址
- 并向../../consumers目錄寫(xiě)入自己的url地址
- 監(jiān)控中心啟動(dòng)時(shí):
- 訂閱/dubbo/com.foo.BarService/目錄下所有的提供者和消費(fèi)者url地址
支持以下功能
- 當(dāng)提供者出現(xiàn)異常停機(jī)時(shí),注冊(cè)中心能自動(dòng)刪除提供者信息
- 當(dāng)注冊(cè)中心重啟以及會(huì)員過(guò)期時(shí),能自動(dòng)恢復(fù)注冊(cè)數(shù)據(jù)以及訂閱請(qǐng)求
- 記錄失敗注冊(cè)和請(qǐng)求,后臺(tái)定時(shí)重試
- ***等等
服務(wù)暴露的詳細(xì)過(guò)程
服務(wù)提供者暴露一個(gè)服務(wù)的詳細(xì)過(guò)程:
image
- 首先ServiceConfig類拿到對(duì)外提供服務(wù)的實(shí)際類ref
- 然后將ProxyFactory類的getInvoker方法使用ref生成一個(gè)AbstractProxyInvoker。到這一步就完成具體服務(wù)到invoker(調(diào)用者)的轉(zhuǎn)化
- 接下來(lái)就是Invoker轉(zhuǎn)換成Exporer,Dubbo協(xié)議實(shí)現(xiàn):
- DubboProtocol類的export方法,主要是打開(kāi)socket偵聽(tīng)服務(wù),并接收客戶端發(fā)來(lái)的各種請(qǐng)求。
服務(wù)消費(fèi)者詳細(xì)過(guò)程
- ReferenceConfig類的init方法調(diào)用Protocol的refer方法生成Invoker實(shí)例
- 把Invoker轉(zhuǎn)為客戶端需要的接口
核心概念總結(jié)
- ProxyFactory
- 實(shí)現(xiàn)了所有服務(wù)接口的透明化代理,有兩個(gè)方法
- getInvoker 服務(wù)端使用 將實(shí)現(xiàn)類封裝成一個(gè)Invoker
- getProxy 客戶端使用 創(chuàng)建接口的代理對(duì)象
- Invoker
- 封裝了一個(gè)服務(wù)的相關(guān)信息,是一個(gè)服務(wù)的可執(zhí)行體
- Invocation
- 會(huì)話域 它持有調(diào)用過(guò)程中的變量。比如方法名,參數(shù)等
- Protocol
- 服務(wù)域 他是Invoker引用和暴露的主要入口,負(fù)責(zé)Invoker的生命周期管理
- Exporter
- 具體執(zhí)行Invoker的生命周期
- Exchange
- 封裝請(qǐng)求響應(yīng)模式,同步轉(zhuǎn)異步
- Transport
- 網(wǎng)絡(luò)傳輸層 抽象mine netty的統(tǒng)一接口