dubbo

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)用流程

  1. 服務(wù)容易啟動(dòng)、加載,運(yùn)行服務(wù)提供者
  2. 服務(wù)提供者啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己要提供的服務(wù)
  3. 服務(wù)消費(fèi)者啟動(dòng)時(shí),向注冊(cè)中心訂閱自己所需的服務(wù)
  4. 注冊(cè)中心返回提供者地址列表給消費(fèi)者。如果有變更,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者
  5. 服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果失敗,再選擇另一臺(tái)
  6. 消費(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)一接口

參考文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容