分布式
Dubbo
1. 什么是Dubbo
Dubbo是一個(gè)分布式服務(wù)框架浩聋,替代了webService中的wsdl甲捏,采用消費(fèi)者與服務(wù)者在注冊(cè)中心注冊(cè)的方法來實(shí)現(xiàn)遠(yuǎn)程服務(wù)調(diào)用,是個(gè)遠(yuǎn)程服務(wù)調(diào)用的分布式框架。
Dubbo脫胎于阿里的電商系統(tǒng)银室。當(dāng)網(wǎng)站流量很小的時(shí)候鳄逾,ORM就足以滿足需求稻轨。而當(dāng)系統(tǒng)增長(zhǎng),第一步的擴(kuò)容方法就是采用MVC來垂直架構(gòu)項(xiàng)目严衬。而當(dāng)垂直應(yīng)用越來越多澄者,應(yīng)用之間的交互將不可避免,我們將核心業(yè)務(wù)抽取出來作為獨(dú)立的服務(wù)從而形成穩(wěn)定的服務(wù)中心请琳,這就是RPC分布式應(yīng)用架構(gòu)粱挡。而當(dāng)服務(wù)進(jìn)一步增長(zhǎng),我們就需要使用面向服務(wù)的SOA相關(guān)技術(shù)俄精。
而Dubbo提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案和SOA服務(wù)治理方案询筏,他可以每天為兩千多個(gè)服務(wù)提供大于30億次的訪問量支持,在國(guó)內(nèi)得到了極其廣泛的應(yīng)用竖慧。
參考:
《Dubbo入門---搭建一個(gè)最簡(jiǎn)單的Demo框架》
《Dubbo是什么嫌套?能做什么?》
2. 什么是RPC圾旨、如何實(shí)現(xiàn)RPC踱讨、RPC 的實(shí)現(xiàn)原理
遠(yuǎn)程過程調(diào)用(Remote Procedure Call Protocol)是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(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ù)器模式滋早,請(qǐng)求程序是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器砌们,首先杆麸,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程搁进,然后等待應(yīng)答信息。在服務(wù)器端昔头,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止拷获。當(dāng)一個(gè)調(diào)用信息到達(dá)服務(wù)器獲得進(jìn)程參數(shù),計(jì)算機(jī)國(guó)减细,發(fā)送答復(fù)信息匆瓜,然后等待下一個(gè)調(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)行序列化和反序列化操作,因?yàn)樯婕暗皆诰W(wǎng)絡(luò)上進(jìn)行傳輸纸型,任何類型的數(shù)據(jù)都需要轉(zhuǎn)化為二進(jìn)制拇砰,也就是序列化。序列化和反序列化的方式很多狰腌,可以使用Java本身內(nèi)置的序列化方式除破,JSON,XML等琼腔。
參考:
《Dubbo入門---搭建一個(gè)最簡(jiǎn)單的Demo框架》
《基于TCP和HTTP協(xié)議的RPC簡(jiǎn)單實(shí)現(xiàn)》
3. Dubbo中的SPI是什么概念
SPI即Service Provider Interface瑰枫,是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制。它是一種動(dòng)態(tài)替換發(fā)現(xiàn)的機(jī)制丹莲,為某個(gè)接口尋找服務(wù)光坝,將裝配的控制權(quán)轉(zhuǎn)移到程序之外。
Dubbo采用了微內(nèi)核+插件體系甥材,使得設(shè)計(jì)優(yōu)雅盯另,擴(kuò)展性也強(qiáng)大。我們定義了服務(wù)接口標(biāo)準(zhǔn)洲赵,讓廠商去實(shí)現(xiàn)鸳惯,JDK通過ServiceLoader類即可實(shí)現(xiàn)SPI機(jī)制的服務(wù)查找功能。
Dubbo使用的ExtensionLoader類似ServiceLoader類板鬓,其中含有一個(gè)靜態(tài)屬性:
ConcurrentMap, ExtensionLoader>EXTENSION_LOADERS = new ConcurrentHashMap, ExtensionLoader>();
用于緩存所有的擴(kuò)展加載實(shí)例悲敷,這里加載Protocol.class究恤,就以Protocol.class為key俭令,創(chuàng)建的ExtensionLoader為value存儲(chǔ)到上述EXTENSION_LOADERS中
這里沒有進(jìn)行任何的加載操作。
我們來看下部宿,ExtensionLoader實(shí)例是如何來加載Protocol的實(shí)現(xiàn)類的:
先解析Protocol上的Extension注解的name,存至String cachedDefaultName屬性中抄腔,作為默認(rèn)的實(shí)現(xiàn)
到類路徑下的加載 META-INF/services/com.alibaba.dubbo.rpc.Protocol文件
參考:
《跟我學(xué)Dubbo系列之Java SPI機(jī)制簡(jiǎn)介》
《dubbo之SPI解析》
4. Dubbo的基本原理瓢湃、執(zhí)行流程
Dubbo的整體架構(gòu)如下:
- Provider:暴露服務(wù)的服務(wù)提供方
服務(wù)提供者在啟動(dòng)時(shí),需要向注冊(cè)中心注冊(cè)自己提供的服務(wù)赫蛇。 - Consumer:調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方
服務(wù)消費(fèi)者在啟動(dòng)時(shí)绵患,向注冊(cè)中心訂閱自己所需要的服務(wù)。 - Registry:服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心
注冊(cè)中心返回服務(wù)提供者列表給消費(fèi)者悟耘,如果有變更落蝙,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者。 - Monitor:統(tǒng)計(jì)服務(wù)的調(diào)用次數(shù)和調(diào)用時(shí)間的監(jiān)控中心
服務(wù)消費(fèi)者和提供者在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間暂幼,將會(huì)定時(shí)發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心筏勒。 - Container:服務(wù)運(yùn)行容器
負(fù)責(zé)啟動(dòng),加載旺嬉,運(yùn)行服務(wù)提供者管行。
Dubbo采用全Spring配置方式,透明化接入應(yīng)用邪媳,對(duì)應(yīng)用沒有任何API侵入捐顷,只需要Spring加載Dubbo的配置即可,Dubbo基于SPring的Schema擴(kuò)展進(jìn)行加載雨效。