Dubbo入門(mén)-協(xié)議&注冊(cè)中心(1)

Dubbo入門(mén)-協(xié)議&注冊(cè)中心

一、配置dubbo多協(xié)議模式

1、默認(rèn)協(xié)議

?Dubbo缺省協(xié)議采用單一長(zhǎng)連接和NIO異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。Dubbo缺省協(xié)議不適合傳送大數(shù)據(jù)量的服務(wù),比如傳文件,傳視頻等,除非請(qǐng)求量很低。

或表示該服務(wù)使用JVM共享長(zhǎng)連接。(缺省)

或表示該服務(wù)使用獨(dú)立長(zhǎng)連接。

或表示該服務(wù)使用獨(dú)立兩條長(zhǎng)連接。

為防止被大量連接撐掛,可在服務(wù)提供方限制大接收連接數(shù),以實(shí)現(xiàn)服務(wù)提供方自我保護(hù)。

缺省協(xié)議,使用基于mina1.1.7+hessian3.2.1的tbremoting交互。

連接個(gè)數(shù):?jiǎn)芜B接

連接方式:長(zhǎng)連接

傳輸協(xié)議:TCP

傳輸方式:NIO異步傳輸

序列化:Hessian二進(jìn)制序列化

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較?。ńㄗh小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無(wú)法壓滿提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。

適用場(chǎng)景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用

為什么要消費(fèi)者比提供者個(gè)數(shù)多:

因dubbo協(xié)議采用單一長(zhǎng)連接,

假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡(1024Mbit=128MByte),

根據(jù)測(cè)試經(jīng)驗(yàn)數(shù)據(jù)每條連接最多只能壓滿7MByte(不同的環(huán)境可能不一樣,供參考),

理論上1個(gè)服務(wù)提供者需要20個(gè)服務(wù)消費(fèi)者才能壓滿網(wǎng)卡。

為什么不能傳大包:

因dubbo協(xié)議采用單一長(zhǎng)連接,

如果每次請(qǐng)求的數(shù)據(jù)包大小為500KByte,假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡(1024Mbit=128MByte),每條連接最大7MByte(不同的環(huán)境可能不一樣,供參考),

單個(gè)服務(wù)提供者的TPS(每秒處理事務(wù)數(shù))最大為:128MByte / 500KByte = 262。

單個(gè)消費(fèi)者調(diào)用單個(gè)服務(wù)提供者的TPS(每秒處理事務(wù)數(shù))最大為:7MByte / 500KByte = 14。

如果能接受,可以考慮使用,否則網(wǎng)絡(luò)將成為瓶頸。

為什么采用異步單一長(zhǎng)連接:

因?yàn)榉?wù)的現(xiàn)狀大都是服務(wù)提供者少,通常只有幾臺(tái)機(jī)器,

而服務(wù)的消費(fèi)者多,可能整個(gè)網(wǎng)站都在訪問(wèn)該服務(wù),

比如Morgan的提供者只有6臺(tái)提供者,卻有上百臺(tái)消費(fèi)者,每天有1.5億次調(diào)用,

如果采用常規(guī)的hessian服務(wù),服務(wù)提供者很容易就被壓跨,

通過(guò)單一連接,保證單一消費(fèi)者不會(huì)壓死提供者,

長(zhǎng)連接,減少連接握手驗(yàn)證等,

并使用異步IO,復(fù)用線程池,防止C10K問(wèn)題。

(1) 約束:

參數(shù)及返回值需實(shí)現(xiàn)Serializable接口

參數(shù)及返回值不能自定義實(shí)現(xiàn)List, Map, Number, Date, Calendar等接口,只能用JDK自帶的實(shí)現(xiàn),因?yàn)閔essian會(huì)做特殊處理,自定義實(shí)現(xiàn)類中的屬性值都會(huì)丟失。()

Hessian序列化,只傳成員屬性值和值的類型,不傳方法或靜態(tài)變量,兼容情況:

總結(jié):會(huì)拋異常的情況:枚 舉值一邊多一種,一邊少一種,正好使用了差別的那種,或者屬性名相同,類型不同

接口增加方法,對(duì)客戶端無(wú)影響,如果該方法不是客戶端需要的,客戶端不需要重新部署;

輸入?yún)?shù)和結(jié)果集中增加屬性,對(duì)客戶端無(wú)影響,如果客戶端并不需要新屬性,不用重新

部署;

輸入?yún)?shù)和結(jié)果集屬性名變化,對(duì)客戶端序列化無(wú)影響,但是如果客戶端不重新部署,不管輸入還是輸出,屬性名變化的屬性值是獲取不到的。

總結(jié):服務(wù)器端和客戶端對(duì)領(lǐng)域?qū)ο蟛⒉恍枰耆恢?,而是按照最大匹配原則。

(2) 配置:

dubbo.properties:

dubbo.service.protocol=dubbo

2、 rmi協(xié)議

RMI協(xié)議采用JDK標(biāo)準(zhǔn)的java.rmi.*實(shí)現(xiàn),采用阻塞式短連接和JDK標(biāo)準(zhǔn)序列化方式。

如果服務(wù)接口繼承了java.rmi.Remote接口,可以和原生RMI互操作,即:

提供者用Dubbo的RMI協(xié)議暴露服務(wù),消費(fèi)者直接用標(biāo)準(zhǔn)RMI接口調(diào)用,

或者提供方用標(biāo)準(zhǔn)RMI暴露服務(wù),消費(fèi)方用Dubbo的RMI協(xié)議調(diào)用。

如果服務(wù)接口沒(méi)有繼承java.rmi.Remote接口,

缺省Dubbo將自動(dòng)生成一個(gè)com.xxx.XxxService$Remote的接口,并繼承java.rmi.Remote接口,并以此接口暴露服務(wù),

但如果設(shè)置了,將不生成$Remote接口,而使用Spring的RmiInvocationHandler接口暴露服務(wù),和Spring兼容。

Java標(biāo)準(zhǔn)的遠(yuǎn)程調(diào)用協(xié)議。

連接個(gè)數(shù):多連接

連接方式:短連接

傳輸協(xié)議:TCP

傳輸方式:同步傳輸

序列化:Java標(biāo)準(zhǔn)二進(jìn)制序列化

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,消費(fèi)者與提供者個(gè)數(shù)差不多,可傳文件。

適用場(chǎng)景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用,與原生RMI服務(wù)互操作

(1) 約束:

參數(shù)及返回值需實(shí)現(xiàn)Serializable接口

dubbo配置中的超時(shí)時(shí)間對(duì)rmi無(wú)效,需使用java啟動(dòng)參數(shù)設(shè)置:-Dsun.rmi.transport.tcp.responseTimeout=3000,參見(jiàn)下面的RMI配置。

3、 hessian協(xié)議

Hessian協(xié)議用于集成Hessian的服務(wù),Hessian底層采用Http通訊,采用Servlet暴露服務(wù),Dubbo缺省內(nèi)嵌Jetty作為服務(wù)器實(shí)現(xiàn)。

Hessian是Caucho開(kāi)源的一個(gè)RPC框架:http://hessian.caucho.com,其通訊效率高于WebService和Java自帶的序列化。

可以和原生Hessian服務(wù)互操作,即:

提供者用Dubbo的Hessian協(xié)議暴露服務(wù),消費(fèi)者直接用標(biāo)準(zhǔn)Hessian接口調(diào)用,

或者提供方用標(biāo)準(zhǔn)Hessian暴露服務(wù),消費(fèi)方用Dubbo的Hessian協(xié)議調(diào)用。

基于Hessian的遠(yuǎn)程調(diào)用協(xié)議。

連接個(gè)數(shù):多連接

連接方式:短連接

傳輸協(xié)議:HTTP

傳輸方式:同步傳輸

序列化:Hessian二進(jìn)制序列化

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者壓力較大,可傳文件。

適用場(chǎng)景:頁(yè)面?zhèn)鬏?,文件傳輸,或與原生hessian服務(wù)互操作

(1) 約束:

參數(shù)及返回值需實(shí)現(xiàn)Serializable接口

參數(shù)及返回值不能自定義實(shí)現(xiàn)List, Map, Number, Date, Calendar等接口,只能用JDK自帶的實(shí)現(xiàn),因?yàn)閔essian會(huì)做特殊處理,自定義實(shí)現(xiàn)類中的屬性值都會(huì)丟失。

注意,如果使用servlet派發(fā)請(qǐng)求:

協(xié)議的端口必須與servlet容器的端口相同,

協(xié)議的上下文路徑必須與servlet應(yīng)用的上下文路徑相同。

4、http協(xié)議

?? 此協(xié)議采用spring 的HttpInvoker的功能實(shí)現(xiàn),

? 連接個(gè)數(shù):多個(gè)

? 連接方式:長(zhǎng)連接

? 連接協(xié)議:http

傳輸方式:同步傳輸

序列化:表單序列化

適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,提供者比消費(fèi)者個(gè)數(shù)多,可用瀏覽器查看,可用表單或URL傳入?yún)?shù),暫不支持傳文件。

? 適用場(chǎng)景:需同時(shí)給應(yīng)用程序和瀏覽器js使用的服務(wù)。

5、Rest協(xié)議

? 當(dāng)當(dāng)網(wǎng)開(kāi)發(fā)的Dubbox提供了Rest協(xié)議,支持REST風(fēng)格遠(yuǎn)程調(diào)用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中實(shí)現(xiàn)了REST風(fēng)格(HTTP + JSON/XML)的遠(yuǎn)程調(diào)用,以顯著簡(jiǎn)化企業(yè)內(nèi)部的跨語(yǔ)言交互,同時(shí)顯著簡(jiǎn)化企業(yè)對(duì)外的Open API、無(wú)線API甚至AJAX服務(wù)端等等的開(kāi)發(fā)。事實(shí)上,這個(gè)REST調(diào)用也使得Dubbo可以對(duì)當(dāng)今特別流行的“微服務(wù)”架構(gòu)提供基礎(chǔ)性支持。

6、thrift協(xié)議

當(dāng)前 dubbo 支持的 thrift 協(xié)議是對(duì) thrift 原生協(xié)議的擴(kuò)展,在原生協(xié)議的基礎(chǔ)上添加了一些額外的頭信息,比如service name,magic number等。使用dubbo thrift協(xié)議同樣需要使用thrift的idl compiler編譯生成相應(yīng)的java代碼,后續(xù)版本中會(huì)在這方面做一些增強(qiáng)

Thrift不支持?jǐn)?shù)據(jù)類型:

null值 (不能在協(xié)議中傳遞null值)


? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?

? ? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?

? ? xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd ? ? ? ?http://code.alibabatech.com/schema/dubbo ? ? ? ?http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ?



? ? ?



? ? ? ??



? ? ?

? ? ? ?

? ? ?

? ? ?


? ? ? ? ??



? ? ? ?



?


同服務(wù)使用多協(xié)議


? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?

? ? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?

? ? xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ?


? ? ?

? ? ?



? ? ?

? ? ?



? ? ?


二、多注冊(cè)中心

同時(shí)向2個(gè)注冊(cè)中心,注冊(cè)服務(wù),這樣,2個(gè)注冊(cè)中心都擁有此服務(wù)

同樣,不同的服務(wù)可以注冊(cè)到不同的注冊(cè)中心,比如:CRM有些服務(wù)是專門(mén)為國(guó)際站設(shè)計(jì)的,有些服務(wù)是專門(mén)為中文站設(shè)計(jì)的(官方文檔舉得例子)。


? ? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ?

? ? xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" ?

? ? xsi:schemaLocation="http://www.springframework.org/schema/beans ? ? ? ?http://www.springframework.org/schema/beans/spring-beans.xsd ? ? ? ?http://code.alibabatech.com/schema/dubbo ? ? ? ?http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> ?



? ? ?



? ? ? ??

? ? ?


? ? ?

? ? ? ?


? ? ? ?



? ? ? ?



?


掃一掃 關(guān)注我們吧~

更多教程“閱讀原文

?著作權(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)容