理論:第十二章:Dubbo的運(yùn)行原理,支持什么協(xié)議,與SpringCould相比它為什么效率要高一些,Zookeeper底層原理

Dubbo

簡單的介紹一下Dubbo?(Dubbo是什么)

dubbo就是個(gè)服務(wù)調(diào)用的東東。

為什么怎么說呢?

因?yàn)镈ubbo是由阿里開源的一個(gè)RPC分布式框架

那么RPC是什么呢?

就是不同的應(yīng)用部署到不同的服務(wù)器上,應(yīng)用之間想要調(diào)用沒有辦法直接調(diào)用,因?yàn)椴辉谝粋€(gè)內(nèi)存空間,需要通過網(wǎng)絡(luò)通訊來調(diào)用,或者傳達(dá)調(diào)用的數(shù)據(jù)。而且RPC會(huì)將遠(yuǎn)程調(diào)用的細(xì)節(jié)隱藏起來,讓調(diào)用遠(yuǎn)程服務(wù)像調(diào)用本地服務(wù)一樣簡單。

dubbo有哪些組件?

紫色虛線:在Dubbo啟動(dòng)時(shí)完成的功能 藍(lán)青色的線:都是程序運(yùn)行過程中執(zhí)行的功能,虛線是異步操作,實(shí)線是同步操作

Provider:提供者,服務(wù)發(fā)布方。如果是采用SOA開發(fā)的模式,這個(gè)就是和數(shù)據(jù)庫交互的接口,也就是service主要放在生產(chǎn)者這邊

Consumer:消費(fèi)者,調(diào)用服務(wù)方。面向前端的Controller主要是在這邊,可以遠(yuǎn)程調(diào)用生產(chǎn)者中的方法,生產(chǎn)者發(fā)生變化時(shí)也會(huì)實(shí)時(shí)更新消費(fèi)者的調(diào)用列表。具體的看下面介紹

Container:主要負(fù)責(zé)啟動(dòng)、加載、運(yùn)行服務(wù)提供者。Dubbo容器,依賴于Spring容器。這里比較注意的就是Dubbo是依賴與Spring容器的。所以必須要和Spring配合著使用

Registry:注冊中心.當(dāng)Container啟動(dòng)時(shí)把所有可以提供的服務(wù)列表上Registry中進(jìn)行注冊。作用:告訴Consumer提供了什么服務(wù)和服務(wù)方在哪里.

Monitor:監(jiān)控中心:監(jiān)控中心負(fù)責(zé)統(tǒng)計(jì)各服務(wù)調(diào)用次數(shù)、調(diào)用時(shí)間

運(yùn)行原理?

0.Start: 啟動(dòng)容器,相當(dāng)于在啟動(dòng)Dubbo的Provider,并且會(huì)創(chuàng)建對應(yīng)的目錄結(jié)構(gòu),例如代碼中的共用接口名為com.learnDubbo.demo.DemoService,就會(huì)創(chuàng)建 /dubbo/com.learnDubbo.demo.DemoService目錄,然后在創(chuàng)建providers目錄,再在providers目錄下寫入自己的 URL 地址。

1.Register:啟動(dòng)后會(huì)去注冊中心進(jìn)行注冊,注冊所有可以提供的服務(wù)列表。即訂閱/dubbo/com.learnDubbo.demo.DemoService 目錄下的所有提供者和消費(fèi)者 URL 地址。

2.Subscribe:Consumer在啟動(dòng)時(shí),不僅僅會(huì)注冊自身到 …/consumers/目錄下,同時(shí)還會(huì)訂閱…/providers目錄,實(shí)時(shí)獲取其上Provider的URL字符串信息。當(dāng)服務(wù)消費(fèi)者啟動(dòng)時(shí):會(huì)在/dubbo/com.learnDubbo.demo.DemoService目錄創(chuàng)建/consumers目錄,并在/consumers目錄寫入自己的 URL 地址。

3.notify:當(dāng)Provider有修改后,注冊中心會(huì)把消息推送給Consummer。也就是注冊中心會(huì)對Provider進(jìn)行觀察,這里就是使用設(shè)計(jì)模式中的觀察者模式。以Zookeeper注冊中心為例,Dubbo中有ZookeeperRegistry中的doSubscribe方法也就是進(jìn)行生產(chǎn)者訂閱和監(jiān)聽。

4、invoke:根據(jù)獲取到的Provider地址,真實(shí)調(diào)用Provider中功能。這里就是唯一一個(gè)同步的方法,因?yàn)橄M(fèi)者要得到生產(chǎn)者傳來的數(shù)據(jù)才能進(jìn)行下一步操作,但是Dubbo是一個(gè)RPC框架,RPC的核心就在于只能知道接口不能知道內(nèi)部具體實(shí)現(xiàn)。所以在Consumer方使用了代理設(shè)計(jì)模式,創(chuàng)建一個(gè)Provider方類的一個(gè)代理對象,通過代理對象獲取Provider中真實(shí)功能,起到保護(hù)Provider真實(shí)功能的作用。

5、Monitor:Consumer和Provider每隔1分鐘向Monitor發(fā)送統(tǒng)計(jì)信息,統(tǒng)計(jì)信息包含,訪問次數(shù),頻率等

Dubbo與SpringCould相比它為什么效率要高一些

首先看一下Dubbo支持什么協(xié)議?dubbo各種協(xié)議的性能對比:

thrift協(xié)議:

thrift原生協(xié)議性能表現(xiàn)卓越,是dubbo原生性能的6倍

dubbo協(xié)議:

定義:缺省協(xié)議、采用了單一長連接和NIO異步通訊、使用線程池并發(fā)處理請求,能減少握手和加大并發(fā)效率

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較?。ńㄗh小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無法壓滿提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。
適用場景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用

hession協(xié)議:
定義:用于集成Hessian的服務(wù),Hessian底層采用Http通訊,采用Servlet暴露服務(wù),Dubbo缺省內(nèi)嵌Jetty作為服務(wù)器實(shí)現(xiàn)
適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者壓力較大,可傳文件。
適用場景:頁面?zhèn)鬏?,文件傳輸,或與原生hessian服務(wù)互操作。

各種協(xié)議的取舍:https://www.cnblogs.com/barrywxx/p/8589374.html

案例測試:

可以看出dubbo通信的效率上高與SpringCould,那為什么會(huì)高于呢?

SpringCloud 服務(wù)間的通信方式有兩種

    RestTemplate 方式

    Feign 的方式

不管是什么方式,它都是通過REST接口調(diào)用服務(wù)的http接口,參數(shù)和結(jié)果默認(rèn)都是通過jackson序列化和反序列化。

也就是說SpringCould是Http請求。

dubbo我們都知道是RPC分布式框架,默認(rèn)是基于dubbo自定義的二進(jìn)制協(xié)議進(jìn)行傳輸,消息體比較簡單,傳輸數(shù)據(jù)要小很多。

案例測試:

結(jié)論:RPC請求的效率是HTTP請求的1.6倍左右,性能明顯比HTTP請求要高很多,因?yàn)镠TTP協(xié)議包含大量的請求頭、響應(yīng)頭信息。
Zookeeper:

Zookeeper的實(shí)現(xiàn)原理?(工作原理)

Zookeeper會(huì)維護(hù)一個(gè)類似于標(biāo)準(zhǔn)的文件系統(tǒng)的具有層次關(guān)系的數(shù)據(jù)結(jié)構(gòu)。這個(gè)文件系統(tǒng)中每個(gè)子目錄項(xiàng)都被稱為znode節(jié)點(diǎn),這個(gè)znode節(jié)點(diǎn)也可以有子節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都可以存儲數(shù)據(jù),客戶端也可以對這些node節(jié)點(diǎn)進(jìn)行g(shù)etChildren,getData,exists方法,同時(shí)也可以在znode tree路徑上設(shè)置watch(類似于監(jiān)聽),當(dāng)watch路徑上發(fā)生節(jié)點(diǎn)create、delete、update的時(shí)候,會(huì)通知到client。client可以得到通知后,再獲取數(shù)據(jù),執(zhí)行業(yè)務(wù)邏輯操作。Zookeeper 的作用主要是用來維護(hù)和監(jiān)控存儲的node節(jié)點(diǎn)上這些數(shù)據(jù)的狀態(tài)變化,通過監(jiān)控這些數(shù)據(jù)狀態(tài)的變化,從而達(dá)到基于數(shù)據(jù)的集群管理。

為什么要用zookeeper作為dubbo的注冊中心?能選擇其他的嗎?

Zookeeper的數(shù)據(jù)模型是由一系列的Znode數(shù)據(jù)節(jié)點(diǎn)組成,和文件系統(tǒng)類似。zookeeper的數(shù)據(jù)全部存儲在內(nèi)存中,性能高;zookeeper也支持集群,實(shí)現(xiàn)了高可用;同時(shí)基于zookeeper的特性,也支持事件監(jiān)聽(服務(wù)的暴露方發(fā)生變化,可以進(jìn)行推送),所以zookeeper適合作為dubbo的注冊中心區(qū)使用。redis、Simple也可以作為dubbo的注冊中心來使用。

項(xiàng)目中主要用zookeeper做了什么?(作用)

作為注冊中心用;主要是在服務(wù)器上搭建zookeeper,其次在spring管理的dubbo的配置文件中配置(暴露方和消費(fèi)方都需要配置)