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

02 | 协议:怎么设计可扩展且向后兼容的协议?

协议体内容
协议头内容
固定部分
支持协议头和协议体的扩展
设计一个可“升级”的协议
可扩展的协议
协议头和协议体
消息边界
避免调用方与被调用方之间的“鸡同鸭讲”
保证二进制数据经过网络传输后能被正确还原语义
请求与响应关联
私有协议设计
与HTTP协议的关系
可扩展的协议
如何设计协议?
协议的作用
RPC协议
协议设计

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

你好,我是何小锋。上一讲我分享了 RPC 原理,其核心是让我们像调用本地一样调用远程,帮助我们的应用层屏蔽远程调用的复杂性,使得我们可以更加方便地构建分布式系统。总结起来,其实就一个关键字:透明化。
接着上一讲的内容,我们再来聊聊 RPC 协议。
一提到协议,你最先想到的可能是 TCP 协议、UDP 协议等等,这些网络传输协议的实现在我看来有点晦涩难懂。虽然在 RPC 中我们也会用到这些协议,但这些协议更多的是对我们上层应用是透明的,我们 RPC 在使用过程中并不太需要关注他们的细节。那我今天要讲的 RPC 协议到底是什么呢?
可能我举个例子,你立马就明白了。HTTP 协议是不是很熟悉(本讲里面所说的 HTTP 默认都是 1.X)? 这应该是我们日常工作中用得最频繁的协议了,每天打开浏览器浏览的网页就是使用的 HTTP 协议。那 HTTP 协议跟 RPC 协议又有什么关系呢?看起来他俩好像不搭边,但他们有一个共性就是都属于应用层协议。
所以我们今天要讲的 RPC 协议就是围绕应用层协议展开的。我们可以先了解下 HTTP 协议,我们先看看它的协议格式是什么样子的。回想一下我们在浏览器里面输入一个 URL 会发生什么?抛开 DNS 解析暂且不谈,浏览器收到命令后会封装一个请求,并把请求发送到 DNS 解析出来的 IP 上,通过抓包工具我们可以抓到请求的数据包,如下图所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

如何设计可扩展且向后兼容的协议? 何小锋在本文中分享了关于RPC协议设计的思考。他首先介绍了协议的作用,指出协议在RPC通信中的重要性,因为它能够帮助接收方正确地读取和解析请求数据。接着,何小锋讨论了如何设计RPC协议。相比于HTTP协议,RPC更注重性能和通信效率,因此需要设计更紧凑的私有协议。在设计RPC协议时,需要考虑消息边界和序列化方式等因素,以确保通信的准确性和可靠性。最后,何小锋提出了一个完整的RPC协议设计方案,包括协议头和协议体的构成,以及各自的作用和内容。 本文通过对协议的作用和设计原则进行阐述,帮助读者了解了RPC协议设计的重要性和复杂性,以及设计可扩展且向后兼容的协议所需考虑的关键因素。设计一个简单的RPC协议并不难,难的是怎么去设计一个可“升级”的协议。文章内容深入浅出,逻辑清晰,对于想要深入了解RPC协议设计的读者具有一定的参考价值。

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

全部留言(72)

  • 最新
  • 精选
  • 楼下小黑哥
    以 Dubbo 为例,消费者发送请求时,使用 AtomicLong 自增,产生一个 消息 ID。由于 Dubbo 底层 IO 操作是异步的,Dubbo 发送请求之后,需要阻塞等待消费者返回信息。消费者会将消息 ID 保存到 Map 结构中,。为了保证请求响应可以一一对应,这就需要提供者返回的响应信息带上请求者消息 ID。 通过响应的消息 ID,通过 上面提到 Map 存储数据,就能找到对应的请求。 感兴趣的同学可以看下 Dubbo 2.6 DefaultFuture 源码。

    作者回复: 你好,非常正确。

    2020-02-18
    15
    133
  • 蚂蚁内推+v
    老师好,您课后问题我有点不能理解。 我们http 请求一个资源不就对应一个返回。是一一对应的关系,为什么会有如何关联响应和请求的问题呢

    作者回复: rpc为了吞吐量,会异步并发发送请求,等待应答,所以需要知道哪个应答对应那个请求

    2020-02-19
    10
    53
  • jfwwlong
    你好,既然基于TCP优于HTTP,gRPC为什么选择基于HTTP2

    作者回复: grpc基于http2,更容易跨语言支持。

    2020-02-21
    7
    34
  • 旭杰
    调用方需要维护消息ID列表,然后和返回结果中的消息ID做匹配

    作者回复: 是的

    2020-02-18
    2
    18
  • eason2017
    老师,你好。请求时带上消息id,响应时,响应体里面带上请求消息的id,这样可以进行关联,对吗?

    作者回复: 很赞。异步场景用于区分应答消息。

    2020-02-18
    2
    17
  • 网络通信在传输层就是一堆堆的0/1码,如果没有协议,那谁知道这一堆堆的0/1是啥意思呢?没人能知道,协议的作用就是通信双方约定好,多少个0/1表示什么意思。 1:Bit Offset——标识协议的其实位置 2:魔术位——标识是什么协议 3:整体长度——标识整个协议有多长,减去协议头长度就是协议体长度 4:头长度——标识协议头的长度,因为头是可扩展的,所以具体长度不固定,需要标识一下 5:协议版本——标识当前协议的版本,用于协议兼容性控制 6:消息类型——标识消息的类型,对于文本的需要,这里也需要嘛?协议类型可能是对象?可能是XML文件?可能是JSON码?正常来讲应该都是对象才对,让用于反序列化,猜测是为了扩展预留的 7:序列化方式——用于消息的序列化和反序列化 8:消息ID——用于表示请求和响应的关系 9:协议头扩展字段——用于扩展协议头,是协议具有扩展性,更加的灵活可控 10协议体——协议的内容,一堆堆的二进制数据,双方沟通的东西 协议头——规定信息转换的规则 协议体——信息真正的内容,由于在传输层对人不友好对应用程序也不友好需要转换一下

    作者回复: 👍

    2020-05-11
    9
    14
  • Jackey
    答案就在题面上,老师的消息协议图里已经设计了消息ID了😃

    作者回复: 看的仔细😁

    2020-02-20
    14
  • (Kelen)
    hhtp现在已经支持长链接了啊

    作者回复: 可以,例如http2。目前性能不如tcp好。

    2020-02-19
    6
    12
  • Tesla
    老师,请问一下魔术位是指的什么啊?

    作者回复: 你可以理解成每个协议的名字

    2020-03-04
    2
    11
  • 看山
    你好,一般RPC为了性能,会采用异步通信的方式,请求响应对应关联,就需要一个类似身份证号的ID,我在自己的项目中实现了类似的场景,https://github.com/howardliu-cn/cynomys/tree/master/cynomys-net

    作者回复: 👍

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