RPC 实战与核心原理
何小锋
京东云混合云首席架构师
39637 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 29 讲
RPC 实战与核心原理
15
15
1.0x
00:00/00:00
登录|注册

03 | 序列化:对象怎么在网络中传输?

你好,我是何小锋。上一讲我讲解了在 RPC 框架中,如何设计可扩展的、向后兼容的协议,其关键点就是利用好 Header 中的扩展字段以及 Payload 中的扩展字段,通过扩展字段向后兼容。
那么承接上一讲的一个重点,今天我会讲解下 RPC 框架中的序列化。要知道,在不同的场景下合理地选择序列化方式,对提升 RPC 框架整体的稳定性和性能是至关重要的。

为什么需要序列化?

首先,我们得知道什么是序列化与反序列化。
我们先回顾下[第 01 讲] 介绍过的 RPC 原理的内容,在描述 RPC 通信流程的时候我说过:
网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。 这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程我们称之为“反序列化”。
这两个过程如下图所示:
序列化与反序列化
总结来说,序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。
那么 RPC 框架为什么需要序列化呢?还是请你回想下 RPC 的通信流程:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(49)

  • 最新
  • 精选
  • 蚂蚁内推+v
    Protostuff对象属性,以及容器内元素都支持null吧,请问老师说的不支持是指在什么场景?

    作者回复: 前几天刚看到最新发布的版本已经改进支持了,原来序列化对象数组空元素有问题。

    3
    42
  • 楼下小黑哥
    我觉得可读性是否也该考虑。 总结下序列化协议可以分为两类 1.文本类序列化方式,如 xml,json。优点就是可读性好,构造方便,调试也简单。不过缺点也明显,传输体积大,性能差。 2.二进制类学序列化方式,如 Hessian,Protobuf,优点性能好。 查了下,其他序列化方式还有 Thrift,Avro。

    作者回复: 是的。根据场景选择

    6
    28
  • 小豆角
    如果要传输的数据只有一个字节,也不需要序列化了。凡是离开内存需要传输或者持久化的数据,都要先进行序列化。数据离开内存,进行io的时候,就应该学习序列化的概念了。序列化就是流化,数据转成字节流。这样认为对吗

    作者回复: 可以

    17
  • 陈国林
    老师你好,请教一个问题。【如果RPC框架基于HTTP协议,并且使用JSON做为序列化协议。那么业务请求数据在网络传输的过程中是JSON格式还是二进制格式呢?或者说 OSI 7层网络模型是否会自动进行一些数据的序列化?】 谢谢~

    作者回复: 所有的网络传输都是二进制,应用看见的是json是因为收到经过了反序列化

    10
    15
  • NEVER SETTLE
    老师,我感觉这节将的序列化与反序列化,与上一节的协议很类似。可以说 protobuf既是序列化方式,也是协议。

    作者回复: 序列化一般用在协议里面的payload里面

    3
    14
  • 雨霖铃声声慢
    我感觉要序列化框架选型的时候也要考虑语言兼容性,比如有些应用是多语言的,那么就要考虑能够兼容多种语言的序列化框架, 比如protobuf就可以编译成Java、python、C++、C#、Go等代码,然后就可以直接使用,不需要再写其他代码,自带有解析的代码。 Kryo也是一种非常成熟的序列化实现,它的性能在各个方面都比hessian2要优秀些,但是Kryo不是线程安全,因此当希望使用Kryo构建的工具类时候,需要在实例化的时候注意线程安全的问题。

    作者回复: 跨语言需求越来越多

    2
    9
  • Sephiroth
    为什么没有说thrift呢?

    作者回复: 也是有名的rpc和序列化

    9
  • 关于如何选择序列化协议: 1、常见的序列化协议有JDK、Hession、Protobuf、JSON、XML; 2、序列化协议的选择指标为序列化性能、序列化后数据大小、协议本身兼容性(协议版本上下兼容性,跨语言兼容性)、安全性。 这几种协议对比如下: 1、JSON、XML,可读性好,但是性能较差,序列化后占用空间大,序列化后数据无类型,需要反射才能获取对象类型; 2、JDK通过InputStream、OutputSteeam来序列化、反序列化,性能也比较差; 3、Hession、Protobuf性能都比较好,Hession对象兼容性更好,Protobuf更加高效。RPC框架一般选用这两种的比较多。

    作者回复: 是的。

    2
    7
  • Jackey
    想到了Redis使用的RESP,在做序列化时也是会增加很多冗余的字符,但它胜在实现简单、可读性强易于理解

    作者回复: 很精简

    7
  • JavaShare
    为什么JSON的额外开销大呢?是因为存在大量的换行吗

    作者回复: 最明显的就是你说的数据包大,因为字符相对二进制更占空间

    4
    6
收起评论
显示
设置
留言
49
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部