dubbo源碼分析25 -- 序列化與反序列化

序列化:把對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化。
反序列化:把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的反序列化。

Dubbo是 Alibaba 開源的分布式服務(wù)框架遠(yuǎn)程調(diào)用框架,現(xiàn)在已捐贈(zèng)給 apache 軟件基本會(huì)。因此 dubbo 調(diào)用是需要跨 JVM,需要進(jìn)行網(wǎng)絡(luò)通信。這就需要使用到序列化與反序列化。在 dubbo 中定義了 ObjectInput、ObjectOutput 與 Serialization 來進(jìn)行數(shù)據(jù)的序列化與反序列化。

1、Serialization 定義

下面我們來看一下 Serialization 的接口定義:

@SPI("hessian2")
public interface Serialization {

    byte getContentTypeId();

    String getContentType();

    @Adaptive
    ObjectOutput serialize(URL url, OutputStream output) throws IOException;

    @Adaptive
    ObjectInput deserialize(URL url, InputStream input) throws IOException;

}

這個(gè)接口里面定義了 4 個(gè)方法:

  • getContentTypeId:獲取序列化 ContextType 的 id。
  • getContentType:獲取到序列化的 ContentType。
  • serialize:創(chuàng)建一個(gè) ObjectOutput (序列化器),用于把對(duì)象轉(zhuǎn)換序列化字節(jié)序列.
  • deserialize:創(chuàng)建一個(gè) ObjectInput (反序列化器),用于把字節(jié)序列恢復(fù)成對(duì)象.

2、支持多種序列化

下面是 Serialization 的類圖:

Serialization.jpg

dubbo 支持多種序列化方式并且序列化是和協(xié)議相對(duì)應(yīng)的。比如:dubbo協(xié)議的 dubbo, hessian2,java,compactedjava,rmi協(xié)議缺省為java,以及http協(xié)議的json等。

  • dubbo序列化:阿里尚未開發(fā)成熟的高效java序列化實(shí)現(xiàn),阿里不建議在生產(chǎn)環(huán)境使用它
  • hessian2序列化:hessian是一種跨語(yǔ)言的高效二進(jìn)制序列化方式。但這里實(shí)際不是原生的hessian2序列化,而是阿里修改過的hessian lite,它是dubbo RPC默認(rèn)啟用的序列化方式
  • json序列化:目前有兩種實(shí)現(xiàn),一種是采用的阿里的fastjson庫(kù),另一種是采用dubbo中自己實(shí)現(xiàn)的簡(jiǎn)單json庫(kù),但其實(shí)現(xiàn)都不是特別成熟,而且json這種文本序列化性能一般不如上面兩種二進(jìn)制序列化。
  • java序列化:主要是采用JDK自帶的Java序列化實(shí)現(xiàn),性能很不理想。

這四種主要序列化方式的性能從上到下依次遞減。對(duì)于dubbo RPC這種追求高性能的遠(yuǎn)程調(diào)用方式來說,實(shí)際上只有1、2兩種高效序列化方式比較般配,而第1個(gè) dubbo 序列化由于還不成熟,所以實(shí)際只剩下2可用,所以dubbo RPC默認(rèn)采用 hessian2 序列化。

但 hessian 是一個(gè)比較老的序列化實(shí)現(xiàn)了,而且它是跨語(yǔ)言的,所以不是單獨(dú)針對(duì)java進(jìn)行優(yōu)化的。而dubbo RPC實(shí)際上完全是一種Java to Java的遠(yuǎn)程調(diào)用,其實(shí)沒有必要采用跨語(yǔ)言的序列化方式(當(dāng)然肯定也不排斥跨語(yǔ)言的序列化)。

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

  • 專門針對(duì)Java語(yǔ)言的:Kryo,F(xiàn)ST等等
  • 跨語(yǔ)言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等

這些序列化方式的性能多數(shù)都顯著優(yōu)于 hessian2 (甚至包括尚未成熟的dubbo序列化)。所以我們可以
為 dubbo 引入 Kryo 和 FST 這兩種高效 Java 來優(yōu)化 dubbo 的序列化。

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

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

或者

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

3、序列化擴(kuò)展

可以通過擴(kuò)展 Serialization、ObjectInput、ObjectOutput 來進(jìn)行 dubbo 序列化的擴(kuò)展。

擴(kuò)展示例

Maven 項(xiàng)目結(jié)構(gòu):

src
 |-main
    |-java
        |-com
            |-xxx
                |-XxxSerialization.java (實(shí)現(xiàn)Serialization接口)
                |-XxxObjectInput.java (實(shí)現(xiàn)ObjectInput接口)
                |-XxxObjectOutput.java (實(shí)現(xiàn)ObjectOutput接口)
    |-resources
        |-META-INF
            |-dubbo
                |-com.alibaba.dubbo.common.serialize.Serialization (純文本文件,內(nèi)容為:xxx=com.xxx.XxxSerialization)

XxxSerialization.java:

package com.xxx;

import com.alibaba.dubbo.common.serialize.Serialization;
import com.alibaba.dubbo.common.serialize.ObjectInput;
import com.alibaba.dubbo.common.serialize.ObjectOutput;


public class XxxSerialization implements Serialization {
    public ObjectOutput serialize(Parameters parameters, OutputStream output) throws IOException {
        return new XxxObjectOutput(output);
    }
    public ObjectInput deserialize(Parameters parameters, InputStream input) throws IOException {
        return new XxxObjectInput(input);
    }
}

META-INF/dubbo/com.alibaba.dubbo.common.serialize.Serialization:

xxx=com.xxx.XxxSerialization

并且通過以下配置來使用新的擴(kuò)展。

<!-- 協(xié)議的序列化方式 -->
<dubbo:protocol serialization="xxx" />
<!-- 缺省值設(shè)置,當(dāng)<dubbo:protocol>沒有配置serialization時(shí),使用此配置 -->
<dubbo:provider serialization="xxx" />

參考資料:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 0 準(zhǔn)備 安裝注冊(cè)中心:Zookeeper、Dubbox自帶的dubbo-registry-simple;安裝Du...
    七寸知架構(gòu)閱讀 14,105評(píng)論 0 88
  • github項(xiàng)目地址https://github.com/SuperMan42/dubbox-ssm 簡(jiǎn)介 SOA...
    hpw123閱讀 2,766評(píng)論 0 10
  • 1. 前言 隨著現(xiàn)在互聯(lián)網(wǎng)行業(yè)的發(fā)展,越來越多的框架、中間件、容器等開源技術(shù)不斷地涌現(xiàn),更好地來服務(wù)于業(yè)務(wù),實(shí)現(xiàn)業(yè)...
    七寸知架構(gòu)閱讀 10,140評(píng)論 11 86
  • 1、不是怕,是我們不具備抗衡的能力 大家印象中,外交部發(fā)言人一般用語(yǔ)是強(qiáng)烈譴責(zé)、嚴(yán)重抗議。。。 簡(jiǎn)單來說就是,別人...
    An_An閱讀 2,319評(píng)論 0 0
  • 別 擔(dān) 心 文/中流擊水 心上 不長(zhǎng)皺紋 臉龐 更年輕 黑夜 沒有燈 眼里有目標(biāo) 照樣前行 書海 浩瀚無(wú)垠 勤奮 ...
    楚山漢水閱讀 275評(píng)論 0 5

友情鏈接更多精彩內(nèi)容