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

视频资源获取失败

开篇词 | 别老想着怎么用好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 原理,其核心是让我们像调用本地一样调用远程,帮助我们的应用层屏蔽远程调用的复杂性,使得我们可以更加方便地构建分布式系统。总结起来,其实就一个关键字:透明化。

接着上一讲的内容,我们再来聊聊 RPC 协议。

一提到协议,你最先想到的可能是 TCP 协议、UDP 协议等等,这些网络传输协议的实现在我看来有点晦涩难懂。虽然在 RPC 中我们也会用到这些协议,但这些协议更多的是对我们上层应用是透明的,我们 RPC 在使用过程中并不太需要关注他们的细节。那我今天要讲的 RPC 协议到底是什么呢?

可能我举个例子,你立马就明白了。HTTP 协议是不是很熟悉(本讲里面所说的 HTTP 默认都是 1.X)? 这应该是我们日常工作中用得最频繁的协议了,每天打开浏览器浏览的网页就是使用的 HTTP 协议。那 HTTP 协议跟 RPC 协议又有什么关系呢?看起来他俩好像不搭边,但他们有一个共性就是都属于应用层协议。

所以我们今天要讲的 RPC 协议就是围绕应用层协议展开的。我们可以先了解下 HTTP 协议,我们先看看它的协议格式是什么样子的。回想一下我们在浏览器里面输入一个 URL 会发生什么?抛开 DNS 解析暂且不谈,浏览器收到命令后会封装一个请求,并把请求发送到 DNS 解析出来的 IP 上,通过抓包工具我们可以抓到请求的数据包,如下图所示:

登录 后留言

全部留言(74)

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

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

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

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

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

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

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

作者回复: 是的

2020-02-18
2
20
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
10
15
Jackey
答案就在题面上,老师的消息协议图里已经设计了消息ID了😃

作者回复: 看的仔细😁

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

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

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

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

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

作者回复: 👍

2020-04-17
6
收起评论