Dubbo

分布式

Dubbo

1. 什么是Dubbo

Dubbo是一個分布式服務(wù)框架,替代了webService中的wsdl,采用消費者與服務(wù)者在注冊中心注冊的方法來實現(xiàn)遠(yuǎn)程服務(wù)調(diào)用,是個遠(yuǎn)程服務(wù)調(diào)用的分布式框架。
Dubbo脫胎于阿里的電商系統(tǒng)。當(dāng)網(wǎng)站流量很小的時候,ORM就足以滿足需求。而當(dāng)系統(tǒng)增長,第一步的擴(kuò)容方法就是采用MVC來垂直架構(gòu)項目。而當(dāng)垂直應(yīng)用越來越多,應(yīng)用之間的交互將不可避免,我們將核心業(yè)務(wù)抽取出來作為獨立的服務(wù)從而形成穩(wěn)定的服務(wù)中心,這就是RPC分布式應(yīng)用架構(gòu)。而當(dāng)服務(wù)進(jìn)一步增長,我們就需要使用面向服務(wù)的SOA相關(guān)技術(shù)。
而Dubbo提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案和SOA服務(wù)治理方案,他可以每天為兩千多個服務(wù)提供大于30億次的訪問量支持,在國內(nèi)得到了極其廣泛的應(yīng)用。

參考:
《Dubbo入門---搭建一個最簡單的Demo框架》
《Dubbo是什么?能做什么?》

2. 什么是RPC、如何實現(xiàn)RPC、RPC 的實現(xiàn)原理

遠(yuǎn)程過程調(diào)用(Remote Procedure Call Protocol)是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序上請求服務(wù)器,而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。
它假定某些類似TCP和UDP的傳輸協(xié)議存在,為通信程序之間攜帶信息數(shù)據(jù)。他的本質(zhì)還是底層的Socket通信。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。它使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。

RPC采用客戶機(jī)/服務(wù)器模式,請求程序是一個客戶機(jī),而服務(wù)提供程序就是一個服務(wù)器,首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個調(diào)用信息到達(dá)服務(wù)器獲得進(jìn)程參數(shù),計算機(jī)國,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息。最后,客戶端調(diào)用進(jìn)程接收DAU信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。

RPC需要注意的是,服務(wù)的調(diào)用方和服務(wù)的提供方之間傳輸?shù)臄?shù)據(jù)需要進(jìn)行序列化和反序列化操作,因為涉及到在網(wǎng)絡(luò)上進(jìn)行傳輸,任何類型的數(shù)據(jù)都需要轉(zhuǎn)化為二進(jìn)制,也就是序列化。序列化和反序列化的方式很多,可以使用Java本身內(nèi)置的序列化方式,JSON,XML等。

參考:
《Dubbo入門---搭建一個最簡單的Demo框架》
《基于TCP和HTTP協(xié)議的RPC簡單實現(xiàn)》

3. Dubbo中的SPI是什么概念

SPI即Service Provider Interface,是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制。它是一種動態(tài)替換發(fā)現(xiàn)的機(jī)制,為某個接口尋找服務(wù),將裝配的控制權(quán)轉(zhuǎn)移到程序之外。

Dubbo采用了微內(nèi)核+插件體系,使得設(shè)計優(yōu)雅,擴(kuò)展性也強(qiáng)大。我們定義了服務(wù)接口標(biāo)準(zhǔn),讓廠商去實現(xiàn),JDK通過ServiceLoader類即可實現(xiàn)SPI機(jī)制的服務(wù)查找功能。

Dubbo使用的ExtensionLoader類似ServiceLoader類,其中含有一個靜態(tài)屬性:
ConcurrentMap, ExtensionLoader>EXTENSION_LOADERS = new ConcurrentHashMap, ExtensionLoader>();

用于緩存所有的擴(kuò)展加載實例,這里加載Protocol.class,就以Protocol.class為key,創(chuàng)建的ExtensionLoader為value存儲到上述EXTENSION_LOADERS中

這里沒有進(jìn)行任何的加載操作。

我們來看下,ExtensionLoader實例是如何來加載Protocol的實現(xiàn)類的:

  1. 先解析Protocol上的Extension注解的name,存至String cachedDefaultName屬性中,作為默認(rèn)的實現(xiàn)

  2. 到類路徑下的加載 META-INF/services/com.alibaba.dubbo.rpc.Protocol文件

參考:
《跟我學(xué)Dubbo系列之Java SPI機(jī)制簡介》
《dubbo之SPI解析》

4. Dubbo的基本原理、執(zhí)行流程

Dubbo的整體架構(gòu)如下:

  1. Provider:暴露服務(wù)的服務(wù)提供方
    服務(wù)提供者在啟動時,需要向注冊中心注冊自己提供的服務(wù)。
  2. Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費方
    服務(wù)消費者在啟動時,向注冊中心訂閱自己所需要的服務(wù)。
  3. Registry:服務(wù)注冊與發(fā)現(xiàn)的注冊中心
    注冊中心返回服務(wù)提供者列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。
  4. Monitor:統(tǒng)計服務(wù)的調(diào)用次數(shù)和調(diào)用時間的監(jiān)控中心
    服務(wù)消費者和提供者在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,將會定時發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。
  5. Container:服務(wù)運行容器
    負(fù)責(zé)啟動,加載,運行服務(wù)提供者。

Dubbo采用全Spring配置方式,透明化接入應(yīng)用,對應(yīng)用沒有任何API侵入,只需要Spring加載Dubbo的配置即可,Dubbo基于SPring的Schema擴(kuò)展進(jìn)行加載。

參考:
《Dubbo是什么?能做什么?》

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

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

  • Dubbo采用微內(nèi)核+插件體系,使得設(shè)計優(yōu)雅,擴(kuò)展性強(qiáng)。那所謂的微內(nèi)核+插件體系是如何實現(xiàn)的呢!大家是否熟悉spi...
    carl_zhao閱讀 1,024評論 1 3
  • dubbo的spi機(jī)制 dubbo的擴(kuò)展點加載機(jī)制源自于java的spi擴(kuò)展機(jī)制。那么,何為java的spi擴(kuò)展機(jī)...
    安迪豬閱讀 710評論 0 1
  • Wikipedia上微內(nèi)核(Microkernel)的定義 In computer science, amicro...
    Java黎先生閱讀 1,413評論 0 1
  • 尾行 讀高中的時候,我的朋友張煜因為長相甜美總會收到男生的求愛。那是90年代末的縣城,男孩子們的求愛方式通常就是寫...
    李荷西閱讀 2,827評論 2 21
  • 一般情況下,顯示3D場景的窗口并不是正方形的,需要通過投影矩陣進(jìn)行變換。
    花神Flora閱讀 1,127評論 0 1

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