面試題
dubbo 支持哪些通信協(xié)議航背?支持哪些序列化協(xié)議?說一下 Hessian 的數(shù)據(jù)結(jié)構(gòu)棱貌?PB 知道嗎玖媚?為什么 PB 的效率是最高的?
面試官心理分析
上一個問題婚脱,說說 dubbo 的基本工作原理今魔,那是你必須知道的,至少要知道 dubbo 分成哪些層障贸,然后平時怎么發(fā)起 rpc 請求的错森,注冊、發(fā)現(xiàn)篮洁、調(diào)用涩维,這些是基本的。
接著就可以針對底層進(jìn)行深入的問問了袁波,比如第一步就可以先問問序列化協(xié)議這塊瓦阐,就是平時 RPC 的時候怎么走的?
面試題剖析
序列化篷牌,就是把數(shù)據(jù)結(jié)構(gòu)或者是一些對象睡蟋,轉(zhuǎn)換為二進(jìn)制串的過程,而反序列化是將在序列化過程中所生成的二進(jìn)制串轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)或者對象的過程娃磺。
dubbo 支持不同的通信協(xié)議
- dubbo 協(xié)議
默認(rèn)就是走 dubbo 協(xié)議薄湿,單一長連接,進(jìn)行的是 NIO 異步通信偷卧,基于 hessian 作為序列化協(xié)議豺瘤。使用的場景是:傳輸數(shù)據(jù)量小(每次請求在 100kb 以內(nèi))听诸,但是并發(fā)量很高坐求。
為了要支持高并發(fā)場景,一般是服務(wù)提供者就幾臺機(jī)器晌梨,但是服務(wù)消費者有上百臺桥嗤,可能每天調(diào)用量達(dá)到上億次!此時用長連接是最合適的仔蝌,就是跟每個服務(wù)消費者維持一個長連接就可以泛领,可能總共就 100 個連接。然后后面直接基于長連接 NIO 異步通信敛惊,可以支撐高并發(fā)請求渊鞋。
長連接,通俗點說,就是建立連接過后可以持續(xù)發(fā)送請求锡宋,無須再建立連接儡湾。
而短連接,每次要發(fā)送請求之前执俩,需要先重新建立一次連接徐钠。
- rmi 協(xié)議
走 Java 二進(jìn)制序列化,多個短連接役首,適合消費者和提供者數(shù)量差不多的情況尝丐,適用于文件的傳輸,一般較少用宋税。
- hessian 協(xié)議
走 hessian 序列化協(xié)議摊崭,多個短連接,適用于提供者數(shù)量比消費者數(shù)量還多的情況杰赛,適用于文件的傳輸,一般較少用矮台。
- http 協(xié)議
走 json 序列化乏屯。
- webservice
走 SOAP 文本序列化。
dubbo 支持的序列化協(xié)議
dubbo 支持 hession瘦赫、Java 二進(jìn)制序列化辰晕、json、SOAP 文本序列化多種序列化協(xié)議确虱。但是 hessian 是其默認(rèn)的序列化協(xié)議含友。
說一下 Hessian 的數(shù)據(jù)結(jié)構(gòu)
Hessian 的對象序列化機(jī)制有 8 種原始類型:
- 原始二進(jìn)制數(shù)據(jù)
- boolean
- 64-bit date(64 位毫秒值的日期)
- 64-bit double
- 32-bit int
- 64-bit long
- null
- UTF-8 編碼的 string
另外還包括 3 種遞歸類型:
- list for lists and arrays
- map for maps and dictionaries
- object for objects
還有一種特殊的類型:
- ref:用來表示對共享對象的引用。
為什么 PB 的效率是最高的校辩?
可能有一些同學(xué)比較習(xí)慣于 JSON
or XML
數(shù)據(jù)存儲格式窘问,對于 Protocal Buffer
還比較陌生。Protocal Buffer
其實是 Google 出品的一種輕量并且高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式宜咒,性能比 JSON
惠赫、XML
要高很多。
其實 PB 之所以性能如此好故黑,主要得益于兩個:第一儿咱,它使用 proto 編譯器,自動進(jìn)行序列化和反序列化场晶,速度非郴觳海快,應(yīng)該比 XML
和 JSON
快上了 20~100
倍诗轻;第二钳宪,它的數(shù)據(jù)壓縮效果好,就是說它序列化后的數(shù)據(jù)量體積小。因為體積小使套,傳輸起來帶寬和速度上會有優(yōu)化罐呼。