dubbo源码分析 - 序列化与反序列化

 

概念:

序列化:把对象转换为字节序列的过程称为对象的序列化。 
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

在Dubbo RPC中,同时支持多种序列化方式:

(1)dubbo序列化,阿里尚不成熟的java序列化实现。

(2)hessian2序列化:hessian是一种跨语言的高效二进制的序列化方式,但这里实际不是原生的hessian2序列化,而是阿里修改过的hessian lite,它是dubbo RPC默认启用的序列化方式。

(3)json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自已实现的简单json库,一般情况下,json这种文本序列化性能不如二进制序列化。

(4)java序列化:主要是采用JDK自带的java序列化实现,性能很不理想。

最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:

  • 专门针对Java语言的:Kryo,FST等等
  • 跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等

这些序列化方式的性能多数都显著优于 hessian2 (甚至包括尚未成熟的dubbo序列化)。所以我们可以 
为 dubbo 引入 Kryo FST 这两种高效 Java 来优化 dubbo 的序列化。

使用Kryo和FST非常简单,只需要在dubbo RPC的XML配置中添加一个属性即可:

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

或者

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

可以通过扩展 Serialization、ObjectInput、ObjectOutput 来进行 dubbo 序列化的扩展。

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

并且通过以下配置来使用新的扩展。

<!-- 协议的序列化方式 -->
<dubbo:protocol serialization="xxx" />
<!-- 缺省值设置,当<dubbo:protocol>没有配置serialization时,使用此配置 -->
<dubbo:provider serialization="xxx" />

猜你喜欢

转载自blog.csdn.net/z15732621582/article/details/81084889