序列化框架

序列化是RPC服务框架实现中重要的一环,因为RPC是远程调用,需要数据序列化后传输,接收后再反序列对象。

序列化库也有不同的性能,有些序列化框架会尽量压缩数据和数据类型,有些包含元数据信息,它们的性能表现不尽相同。

对于Go生态圈的序列化框架,有一些开源项目对它们的性能做了对比,比如 gosercomp做的性能比较:

序列化框架 - 图1

可以看到XML、JSON相对于其它序列化方式性能挺差的,它们的好处在于通用性。比如rpcx实现了JSON-RPC和JSON-RPC2协议,可以和其它编程语言实现通讯。

关于Java的序列化框架的比较可以参考jvm-serializers:
序列化框架 - 图2
目前最快的是colfer,比protobuf、protostuff还快。

rpcx的Server和Client类型都包含一个字段用来设置序列化器:

  1. type Client struct {
  2. ……
  3. ClientCodecFunc ClientCodecFunc
  4. ……
  5. }
  6. type Server struct {
  7. ServerCodecFunc ServerCodecFunc
  8. ……
  9. }

这两个字段的类型定义如下:

  1. type ClientCodecFunc func(conn io.ReadWriteCloser) rpc.ClientCodec
  2. type ServerCodecFunc func(conn io.ReadWriteCloser) rpc.ServerCodec

它们返回官方库的ClientCodec和ServerCodec。

当前rpcx提供了以下的序列化器:gob、bson、colfer、gencode、json-rpc、json-rpc2、protobuf,如果没有进行序列化器的设置,默认使用gob序列化器。

  1. func NewBsonClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  2. func NewBsonServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  3. func NewColferClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  4. func NewColferServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  5. func NewGencodeClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  6. func NewGencodeServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  7. func NewGobClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  8. func NewGobServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  9. func NewJSONRPC2ClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  10. func NewJSONRPC2ServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  11. func NewJSONRPCClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  12. func NewJSONRPCServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec
  13. func NewProtobufClientCodec(conn io.ReadWriteCloser) rpc.ClientCodec
  14. func NewProtobufServerCodec(conn io.ReadWriteCloser) rpc.ServerCodec