Dubbo应用开发之Dubbo中常用的序列化方式

48 阅读2分钟

Dubbo应用开发之Dubbo中常用的序列化方式

在分布式系统中,网络通信是绕不开的话题,而序列化则是网络通信的“最后一公里”。在 Apache Dubbo 中,序列化不仅决定了调用性能,还关系到跨语言互通、兼容性、安全性等多个维度。本文结合 Dubbo 3.x 最新实现,系统梳理 Dubbo 目前支持的常用序列化方式、特点、使用场景及最佳实践,帮助开发者做出最合适的技术选型。

为什么序列化在 Dubbo 中如此重要

  • 性能:序列化/反序列化耗时在网络调用总耗时中占比通常超过 30%,高并发系统尤为敏感。
  • 兼容性:服务升级、字段增减、接口演进需要向前/向后兼容。
  • 跨语言:Dubbo 3.x 原生支持 Triple(gRPC) 协议,序列化决定了多语言互通的边界。
  • 安全性:历史上 Hessian2、Fastjson 均出现过反序列化 RCE 漏洞。
  • 可观测性:序列化格式直接影响链路追踪、日志、Mock 的可读性。

简介

序列化:是Dubbo进⾏RPC中,⾮常重要的⼀个组成部分,其核⼼作⽤就是把⽹络传输中的数据,按照特定的格式进⾏传输。减⼩数据的体积,从⽽提⾼传输效率。

image.png

这里可以看到序列化接口有三个实现类,分别是基于jdk,fastjson2和hessian2的三种方式.下面一一说明三种类型的实现方案:

常见的Dubbo序列化方式

Hessian

Dubbo协议中默认的序列化实现⽅案,我们在没有配置序列化的情况下Dubbo默认使用这种方式

Java Serialization

Java序列化方式,顾名思义是基于java对象的序列化方式,一般不推荐使用因为传输数据体量大,速度慢

Dubbo序列化

阿里尚未开发成熟的序列化方式,基于java实现的高效序列化技术,弥补了Java序列化慢的劣势,阿里不建议在生产环境中使用

Json序列化

目前有俩种方式实现,一种是阿里的fastjson库,另外一种是采用dubbo自带的简单json库,也是一种基于http协议的序列化速度也不快

Kryo

java序列化方式,后续替代Hessian2.是一种非常成熟的序列化实现,已经在多个著名开源项目中使用如推特,hive等

FST

java序列化方式,后续替代Hessian2.是一种比较新的序列化实现,目前暂缺更多的成熟案例

跨语言序列化方式

如ProtoBuf,Thrift,Avro,MsgPack(messagePack是一种高效的二进制序列化格式,它允许多种语言之间进行交换数据,但它更小更快,短整型被编码成一个字节)

常见Dubbo序列化方式速度效果展示

image.png