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等等
跨語言的:Protostuff,ProtoBuf,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