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)注我們吧~
更多教程“閱讀原文”