分布式微服务架构:原理与实战
上QQ阅读APP看书,第一时间看更新

4.1 序列化与反序列化

4.1.1 序列化/反序列化概念

何为序列化?把对象转换为字节序列的过程称为对象的序列化

何为反序列化?把字节序列恢复为对象的过程称为对象的反序列化

项目中通常使用“对象”来进行数据的操纵,但是当需要对数据进行存储(固化存储、缓存存储)或者传输(跨进程网络传输)时,“对象”就不怎么好用了,往往需要把数据转化成连续空间的二进制字节流。序列化和反序列化主要的应用场景有:

  • 数据的网络传输:Socket发送的数据不能是对象,必须是连续空间的二进制字节流。进行远程跨进程服务调用时(例如RPC调用),需要使用特定的序列化技术对需要进行网络传输的对象进行编码或者解码,以便完成远程调用。
  • 缓存的KV存储:Redis/Memcache是KV类型的缓存,缓存存储的value必须是连续空间的二进制字节流,而不能够是对象。
  • 数据库索引的磁盘存储:数据库的索引在内存里是B+树或者Hash的格式,但这个格式是不能够直接存储到磁盘上的,所以需要把B+树或者Hash转化为连续空间的二进制字节流,才能存储到磁盘上。

4.1.2 序列化/反序列化特性

在设计分布式微服务框架时,序列化和反序列化作为框架的一部分,有着举足轻重的地位。比如服务提供者和服务消费者在进行网络通信时,对象需要进行序列化和反序列化,如果序列化框架性能差,就会直接影响整个分布式框架的性能。所以在设计序列化和反序列化框架的时候,我们需要从性能、可扩展性/兼容性、跨语言支持等多个角度进行综合考虑。

1. 性能

影响序列化与反序列化性能的主要因素有:

(1)序列化后码流大小。

(2)序列化/反序列化的速度。

(3)序列化/反序列化系统开销(CPU或者堆内存)。

网络上或者书本上有许多序列化框架性能对比的数据和表格,读者可自行搜索学习,这里不再赘述。通过一些数据对比,我们发现ProtoBuf序列化框架在各个方面都有绝对的优势。

2. 可扩展性/兼用性

移动互联时代,业务系统需求的更新周期变得更短,新的需求不断涌现,而老的系统还需要继续维护。如果序列化协议具有良好的可扩展性,支持自动增加新的业务字段,而不影响老的服务,那么将大大提高系统的灵活度。一个好的序列化框架应该支持数据结构的向前兼容,比如新增字段、删除字段、调整字段顺序等。

3. 跨语言支持

跨语言支持是衡量序列化框架是否通用的一个重要指标,如果序列化框架和某种语言绑定,数据在交换的时候,双方就很难保证一定是采用相同的语言开发的。分布式服务框架在不同的业务、不同的团队可能采用不同的开发语言。不同语言开发的服务要能够互通,序列化和反序列化首先要能够支持互通。