Netty的编解码

一、Java的序列化技术

java的序列化可以通过实现Serializable接口实现,但是在RPC调用中很晒直接使用java的序列化进行消息的编解码和传输,因为java自身的序列化有一下缺点:

  1. 不能跨语言:是java语言内部的私有协议,其他语言比如C++并不支持,当我们进行RPC调用时,其他语言的服务时无法反序列化的;

  2. 序列化后的码流太大:通过实验得到java的序列化后大小是二进制数组的5.29倍;

  3. 序列化性能低:通过实验得到java序列化的性能大概只有二进制编码的6.17%;

二、业界主流的编解码框架

2.1 Google的Protobuf

全称Google Protocol Buffers,使用二进制编码,在谷歌内部久经考验。它将数据结构以.proto文件进行描述,通过代码生成工具可以生成对应的数据结构的POJO对象和Protobuf相关的方法和属性。

2.2 Facebook的Thrift

Thrift可以作为高性能的通信中间件使用,它支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于静态的数据交换,需要先确定好它的数据结构,当数据结构发生改变时,必须重新编辑IDL文件,生成代码和编译,这一点跟其他IDL工具相比可以是视为是Thrift的弱项。Thrift主要由5部分组成:

  • 语言系统以及IDL编译器:负责由用户给定的IDL文件生成相应语言的接口的代码;

  • TProtocol:RPC的协议层,可以选择多种不同的对象序列化方式,如JSON和Binary;

  • TTransport:RPC的传输层,同样可以选择不同的传输层实现,如Socket、NIO、MemoryBuffer等;

  • TProcessor:作为协议层和用户提供的服务实现之间的纽带,负责调用服务实现的接口;

  • TServer:聚合TProtocol、TTransport和TProcessor等对象。

2.3 JBoss Marshalling

是一个java对象序列化的API包,修正了jdk自带的序列化包的很多问题,相对于传统java序列化机制,优点如下:

  • 可插拔的类解析器,提供更加便捷的类加载定制策略,通过一个接口即可实现定制;

  • 可插拔的对象替换技术,不需要通过继承的方式;

  • 可插拔的预定义类缓存表,可以减少序列化的字节数组长度,提升常用类型的对象序列化性能;

  • 无需实现Seriaizable接口,即可实现java序列化;

  • 通过缓存技术提升对象的序列化性能。

相对于前两种框架,JBoss Marshalling更多是在JBoss内部使用,应用范围有限,但是使用非常简单。

Last updated