dubbo序列化


序列化:把對象轉換為字節序列的過程稱為對象的序列化。 
反序列化:把字節序列恢復為對象的過程稱為對象的反序列化。

 

dubbo 支持多種序列化方式並且序列化是和協議相對應的。比如:dubbo協議的 dubbo, hessian2,java,compactedjava,rmi協議缺省為java,以及http協議的json等。

dubbo序列化:阿里尚未開發成熟的高效java序列化實現,阿里不建議在生產環境使用它
hessian2序列化:hessian是一種跨語言的高效二進制序列化方式。但這里實際不是原生的hessian2序列化,而是阿里修改過的hessian lite,它是dubbo RPC默認啟用的序列化方式
json序列化:目前有兩種實現,一種是采用的阿里的fastjson庫,另一種是采用dubbo中自己實現的簡單json庫,但其實現都不是特別成熟,而且json這種文本序列化性能一般不如上面兩種二進制序列化。
java序列化:主要是采用JDK自帶的Java序列化實現,性能很不理想。
這四種主要序列化方式的性能從上到下依次遞減。對於dubbo RPC這種追求高性能的遠程調用方式來說,實際上只有1、2兩種高效序列化方式比較般配,而第1個 dubbo 序列化由於還不成熟,所以實際只剩下2可用,所以dubbo RPC默認采用 hessian2 序列化。

但 hessian 是一個比較老的序列化實現了,而且它是跨語言的,所以不是單獨針對java進行優化的。而dubbo RPC實際上完全是一種Java to Java的遠程調用,其實沒有必要采用跨語言的序列化方式(當然肯定也不排斥跨語言的序列化)。

最近幾年,各種新的高效序列化方式層出不窮,不斷刷新序列化性能的上限,最典型的包括:

專門針對Java語言的:Kryo,FST等等
跨語言的:ProtostuffProtoBuf,Thrift,Avro,MsgPack等等(Ctrip采用ProtoBuf,跨語言)
這些序列化方式的性能多數都顯著優於 hessian2 (甚至包括尚未成熟的dubbo序列化)。所以我們可以
為 dubbo 引入 Kryo 和 FST 這兩種高效 Java 來優化 dubbo 的序列化。

使用Kryo和FST非常簡單,只需要在dubbo RPC的XML配置中添加一個屬性即可:

<dubbo:protocol name="dubbo" serialization="kryo"/>

 

方案調研(Ctrip)

PB(ProtoBuf)和Hessian2序列化器比較

CDubbo默認使用的是Hessian2序列化器,由於良好的兼容性,所以推薦給絕大多數場景使用。

因為Hessian2會在序列化結果中寫入對象的類信息、字段信息等,所以序列化的結果是『自解釋的』,從而對開發者很友好,不需要嚴格限制實體對象字段添加的順序。

PB則出於對性能和序列化大小的考慮,在實際輸出的序列化結果中,不包含任何的類信息、字段信息等,只有字段的序號信息,所以對實體對象的字段順序有嚴格要求,比較容易出錯。

 


原文:https://blog.csdn.net/u012410733/article/details/80889014


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM