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

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

适合在RPC调用中使用的优秀序列化框架
RPC框架在序列化框架的选型上需要考虑的因素
构造简单的入参与返回值对象
选择序列化协议的重要参考因素
对象有复杂的继承关系
使用序列化框架不支持的类作为入参类
对象过于庞大
对象构造得过于复杂
安全性
通用性和兼容性
空间开销
性能和效率
Protobuf
Hessian
JSON
JDK原生序列化
课后思考
总结
RPC框架在使用时要注意哪些问题?
RPC框架中如何选择序列化?
有哪些常用的序列化?
为什么需要序列化?
序列化

该思维导图由 AI 生成,仅供参考

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

为什么需要序列化?

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

在RPC框架中选择合适的序列化方式至关重要。本文介绍了序列化的重要性以及常用的序列化方式,包括JDK原生序列化、JSON、Hessian和Protobuf。针对选择序列化方式时的考量因素,文章提到了性能、空间开销、通用性和兼容性等方面。此外,还强调了序列化协议的安全性对于选择的重要性。在使用RPC框架时,需要注意避免对象过于复杂、庞大,以及使用不受序列化框架支持的类作为入参类等问题。总结指出,Hessian与Protobuf是首选序列化方式,因为它们在多个方面都能满足需求。最后,读者被鼓励思考在RPC框架中选择序列化框架时还需要考虑哪些因素,以及了解更多适合在RPC调用中使用的优秀序列化框架。整体而言,本文深入浅出地介绍了序列化在RPC框架中的重要性和选择方式,为读者提供了全面的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(49)

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

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

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

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

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

    作者回复: 可以

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

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

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

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

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

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

    2020-02-25
    2
    9
  • Sephiroth
    为什么没有说thrift呢?

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

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

    作者回复: 是的。

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

    作者回复: 很精简

    2020-02-24
    8
  • JavaShare
    为什么JSON的额外开销大呢?是因为存在大量的换行吗

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

    2020-04-24
    5
    7
收起评论
显示
设置
留言
49
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部