RPC 实战与核心原理
何小锋
京东云混合云首席架构师
41883 人已学习
新⼈⾸单¥59
课程目录
已完结/共 29 讲
RPC 实战与核心原理
登录|注册
留言
49
收藏
沉浸
阅读
分享
手机端
回顶部
付费课程,可试看

视频资源获取失败

开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
16 | 业务分组:如何隔离流量?
答疑课堂 | 基础篇与进阶篇思考题答案合集
17 | 异步RPC:压榨单机吞吐量
18 | 安全体系:如何建立可靠的安全体系?
19 | 分布式环境下如何快速定位问题?
20 | 详解时钟轮在RPC中的应用
21 | 流量回放:保障业务技术升级的神器
22 | 动态分组:超高效实现秒级扩缩容
23 | 如何在没有接口的情况下进行RPC调用?
24 | 如何在线上环境里兼容多种RPC协议?
结束语 | 学会从优秀项目的源代码中挖掘知识
加餐 | 谈谈我所经历过的RPC
加餐 | RPC框架代码实例详解
本节摘要

你好,我是何小锋。上一讲我讲解了在 RPC 框架中,如何设计可扩展的、向后兼容的协议,其关键点就是利用好 Header 中的扩展字段以及 Payload 中的扩展字段,通过扩展字段向后兼容。

那么承接上一讲的一个重点,今天我会讲解下 RPC 框架中的序列化。要知道,在不同的场景下合理地选择序列化方式,对提升 RPC 框架整体的稳定性和性能是至关重要的。

为什么需要序列化?

首先,我们得知道什么是序列化与反序列化。

我们先回顾下[第 01 讲] 介绍过的 RPC 原理的内容,在描述 RPC 通信流程的时候我说过:

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是不能直接在网络中传输的,所以我们需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。 这时,服务提供方就可以正确地从二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象,这个过程我们称之为“反序列化”。

这两个过程如下图所示:

总结来说,序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。

那么 RPC 框架为什么需要序列化呢?还是请你回想下 RPC 的通信流程:

登录 后留言

全部留言(49)

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

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

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

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

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

作者回复: 可以

2020-02-25
20
陈国林
老师你好,请教一个问题。【如果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
收起评论