dubbo序列化

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

dubbo 支持多种序列化方式并且序列化是和协议相对应的。比如:dubbo协议的 dubbo, hessian2,java,compactedjava,rmi协议缺省为java,以及http协议的json等。

dubbo序列化:阿里尚未开发成熟的高效java序列化实现,阿里不建议在生产环境使用它
hessian2序列化:hessian是一种跨语言的高效二进制序列化方式。但这里实际不是原生的hessian2序列化,而是阿里修改过的hessian lite,它是dubbo RPC默认启用的序列化方式
json序列化:目前有两种实现,一种是采用的阿里的fastjson库,另一种是采用dubbo中自己实现的简单json库,但其实现都不是特别成熟,而且json这种文本序列化性能一般不如上面两种二进制序列化。
java序列化:主要是采用JDK自带的Java序列化实现,性能很不理想。
这四种主要序列化方式的性能从上到下依次递减。对于dubbo RPC这种追求高性能的远程调用方式来说,实际上只有1、2两种高效序列化方式比较般配,而第1个 dubbo 序列化由于还不成熟,所以实际只剩下2可用,所以dubbo RPC默认采用 hessian2 序列化。

但 hessian 是一个比较老的序列化实现了,而且它是跨语言的,所以不是单独针对java进行优化的。而dubbo RPC实际上完全是一种Java to Java的远程调用,其实没有必要采用跨语言的序列化方式(当然肯定也不排斥跨语言的序列化)。

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

专门针对Java语言的:Kryo,FST等等
跨语言的:ProtostuffProtoBuf,Thrift,Avro,MsgPack等等(Ctrip采用ProtoBuf,跨语言)
这些序列化方式的性能多数都显著优于 hessian2 (甚至包括尚未成熟的dubbo序列化)。所以我们可以
为 dubbo 引入 Kryo 和 FST 这两种高效 Java 来优化 dubbo 的序列化。

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

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

方案调研(Ctrip)

PB(ProtoBuf)和Hessian2序列化器比较

CDubbo默认使用的是Hessian2序列化器,由于良好的兼容性,所以推荐给绝大多数场景使用。

因为Hessian2会在序列化结果中写入对象的类信息、字段信息等,所以序列化的结果是『自解释的』,从而对开发者很友好,不需要严格限制实体对象字段添加的顺序。

PB则出于对性能和序列化大小的考虑,在实际输出的序列化结果中,不包含任何的类信息、字段信息等,只有字段的序号信息,所以对实体对象的字段顺序有严格要求,比较容易出错。


原文:https://blog.csdn.net/u012410733/article/details/80889014

猜你喜欢

转载自www.cnblogs.com/twoheads/p/10132574.html
今日推荐