dubbo 支持哪些通訊協議?支持哪些序列化協議?說一下 Hessian 的數據結構?PB 知道嗎?爲何 PB 的效率是最高的?java
面試官心理分析git
上一個問題,說說 dubbo 的基本工做原理,那是你必須知道的,至少要知道 dubbo 分紅哪些層,而後平時怎麼發起 rpc 請求的,註冊、發現、調用,這些是基本的。github
接着就能夠針對底層進行深刻的問問了,好比第一步就能夠先問問序列化協議這塊,就是平時 RPC 的時候怎麼走的?web
面試題剖析面試
序列化,就是把數據結構或者是一些對象,轉換爲二進制串的過程,而反序列化是將在序列化過程當中所生成的二進制串轉換成數據結構或者對象的過程。json
dubbo 支持不一樣的通訊協議數據結構
dubbo 協議併發
默認就是走 dubbo 協議,單一長鏈接,進行的是 NIO 異步通訊,基於 hessian 做爲序列化協議。使用的場景是:傳輸數據量小(每次請求在 100kb 之內),可是併發量很高。異步
爲了要支持高併發場景,通常是服務提供者就幾臺機器,可是服務消費者有上百臺,可能天天調用量達到上億次!此時用長鏈接是最合適的,就是跟每一個服務消費者維持一個長鏈接就能夠,可能總共就 100 個鏈接。而後後面直接基於長鏈接 NIO 異步通訊,能夠支撐高併發請求。高併發
長鏈接,通俗點說,就是創建鏈接事後能夠持續發送請求,無須再創建鏈接。
而短鏈接,每次要發送請求以前,須要先從新創建一次鏈接。
rmi 協議
走 Java 二進制序列化,多個短鏈接,適合消費者和提供者數量差很少的狀況,適用於文件的傳輸,通常較少用。
hessian 協議
走 hessian 序列化協議,多個短鏈接,適用於提供者數量比消費者數量還多的狀況,適用於文件的傳輸,通常較少用。
http 協議
走 json 序列化。
webservice
走 SOAP 文本序列化。
dubbo 支持的序列化協議
dubbo 支持 hession、Java 二進制序列化、json、SOAP 文本序列化多種序列化協議。可是 hessian 是其默認的序列化協議。
說一下 Hessian 的數據結構
Hessian 的對象序列化機制有 8 種原始類型:
原始二進制數據
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:用來表示對共享對象的引用。
可能有一些人比較習慣於 JSON
or XML
數據存儲格式,對於 Protocol Buffer
還比較陌生。Protocol Buffer
實際上是 Google 出品的一種輕量而且高效的結構化數據存儲格式,性能比 JSON
、XML
要高不少。
其實 PB 之因此性能如此好,主要得益於兩個:第一,它使用 proto 編譯器,自動進行序列化和反序列化,速度很是快,應該比 XML
和 JSON
快上了 20~100
倍;第二,它的數據壓縮效果好,就是說它序列化後的數據量體積小。由於體積小,傳輸起來帶寬和速度上會有優化。