Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议

我们可以看到,Dubbo 是一种相对优秀的实现方式。虽然,在最新版本的 Dubbo 项目中,dubbo-serialize 模块已经去除了 Dubbo 序列化的实现,猜测因为引入 Kryo 和 FST ,相比来说更优秀。

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第1张图片

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dubbo的序列化机制

   看一个类TransportCodec,这个类有两个方法:encode和decode,分别是序列化和反序列化的实现

  传输层channel的channelPipeline里面,使用到了DecodeHandler和encodeHandler

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第2张图片

dubbo 引入 Kryo 和 FST 这两种高效 Java 来优化 dubbo 的序列化

 

 

 

 

 

 

 

 

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Dubbo序列化支持java、compactedjava、nativejava、fastjson、fst、hessian2、kryo,其中默认hessian2。其中java、compactedjava、nativejava属于原生java的序列化。整个Dubbo序列化的类设计极其优雅,职责单一,其整体类图如下:

 1、kryo序列化概述
   在这里我不再重复介绍kryo,如果是第一次接触kryo,请详细查看:《Kryo官方文档中文翻译》,对kryo序列化机制有一个全貌的概念,看过上述材料后应该知道kryo具备如下几个典型的特点。
   1、支持泛型
   2、序列化字节序列中可包含类型,反序列化时无需传入类型,对应的API:

    3、支持循环引用
   4、类注册机制,主要是在写入类全路径名时,如果该类注册了,会分配一个int类型的值代替字符串的全面,能减少序列化后二进制流的大小。
   5、Kryo对象非线程安全性,通常使用ThreadLocal、Kryo对象池。
   2、hession2序列化概述
hession2协议我就不班门弄斧了,这里推荐两个不错的网站来学习hession2。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 用过dubbo的开发人员,在选取序列化时都会根据“经验”来选kryo为序列化框,其原因是序列化协议非常高效,超过java原生序列化协议、hessian2协议,那kryo为什么高效呢?

  序列化协议,所谓的高效,通常应该从两方面考虑:

   1、序列化后的二进制序列大小。(核心)

   2、序列化、反序列化的速率。

本节将重点探讨,kryo在减少序列化二进制流上做的努力。
   序列化:将各种数据类型(基本类型、包装类型、对象、数组、集合)等序列化为byte数组的过程。
   反序列化:将byte数组转换为各种数据类型(基本类型、包装类型、对象、数组、集合)。
   java中定义的数据类型所对应的序列化器在Kryo的构造函数中构造,其代码截图:

接下来将详细介绍java常用的数据类型的序列化机制,即Kryo是如何编码二进制流。
   1、DefaultSerializers$IntSerializer int类型序列化

 本节就讲述到这里了,,本节详细分析了Kryo对各种数据类型的序列化机制,其再降低序列化大小方面做了如下优化:
1、Kryo序列化的“对象”是数据以及少量元信息,这和JAVA默认的序列化的本质区别,java默认的序列化的目的是语言层面的,将类、对象的所有信息都序列化了,也就是就算是不加载class的定义,也能根据序列化后的信息动态构建类的所有信息。而Kryo反序列化时,必须能加载类的定义,这样Kryo能节省大量的字节空间。
2、使用变长int、变长long存储int、long类型,大大节省空间。
3、元数据(字符串类型)使用缓存机制,重复出现的字符串使用int来存储,节省存储空间。
4、字符串类型使用UTF-8存储,但会使用ascii码进一步优化空间
https://blog.csdn.net/prestigeding/article/details/81611224

 

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第3张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第4张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第5张图片

Kryo序列化

  kryo是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的体积

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第6张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第7张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第8张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第9张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第10张图片

Dubbo 源码分析14 Dubbo序列化 + kyro高性能对象序列化协议_第11张图片

 

 

你可能感兴趣的:(dubbo)