序列化和反序列化是RPC中非常重要的部分了,也是RPC中必不可少的一部分。

  • 序列化-即将调用的对象转换成可传输的字节序列
  • 反序列化-即将接收到的字节序列转换成对象

当我们使用RPC调用一个方法时,先将我们调用的方法和参数进行序列化,将序列化后的字节序列传输到RPC服务提供者。
当RPC服务提供者收到请求后,进行反序列化将收到的字节序列转换成具体的方法和参数,然后再去执行对应的方法。接着将执行后的结果进行序列化,再传输给调用方。
调用方收到响应的字节序列后,将数据进行反序列化,就得到了调用结果对象。

一次普通的RPC调用,至少要经过上面的两次序列后和两次反序列化。

序列化和反序列化需要一中序列化规范,即序列化前的对象和序列化后的字节之间的一种对应关系。常见的序列化,如json,hessian2,protobuf等。Java中,最基本的就是java自带的Serializable接口了。

由于json是一种可读的文本协议,所以常用于HTTP中。而hessian2和protobuf都是一个二进制协议,序列化后字节序列更小,所以传输速度快,因此这两种协议常用于RPC中序列化和反序列化。

motan中内置了下面两个序列化:

  • com.weibo.api.motan.serialize.Hessian2Serialization
  • com.weibo.api.motan.serialize.FastJsonSerialization

Duboo中内置两下面这些序列化:

  • com.alibaba.dubbo.common.serialize.hessian2.Hessian2Serialization
  • com.alibaba.dubbo.common.serialize.fastjson.FastJsonSerialization
  • com.alibaba.dubbo.common.serialize.java.JavaSerialization
  • com.alibaba.dubbo.common.serialize.java.CompactedJavaSerialization
  • com.alibaba.dubbo.common.serialize.fst.FstSerialization
  • com.alibaba.dubbo.common.serialize.nativejava.NativeJavaSerialization
  • com.alibaba.dubbo.common.serialize.kryo.KryoSerialization

标签: Java, rpc

添加新评论