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

视频资源获取失败

开篇词 | 别老想着怎么用好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 框架在序列化的选择上,我们更关注序列化协议的安全性、通用性、兼容性,其次才关注序列化协议的性能、效率、空间开销。承接上一讲,这一讲,我要专门讲解下 RPC 框架中的网络通信,这也是我们在开篇词中就强调过的重要内容。

那么网络通信在 RPC 调用中起到什么作用呢?

我在[第 01 讲] 中讲过,RPC 是解决进程间通信的一种方式。一次 RPC 调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络 IO 发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次 RPC 调用便结束了。可以说,网络通信是整个 RPC 调用流程的基础。

常见的网络 IO 模型

那说到网络通信,就不得不提一下网络 IO 模型。为什么要讲网络 IO 模型呢?因为所谓的两台 PC 机之间的网络通信,实际上就是两台 PC 机对网络 IO 的操作。

常见的网络 IO 模型分为四种:同步阻塞 IO(BIO)、同步非阻塞 IO(NIO)、IO 多路复用和异步非阻塞 IO(AIO)。在这四种 IO 模型中,只有 AIO 为异步 IO,其他都是同步 IO。

登录 后留言

全部留言(53)

  • 最新
  • 精选
雨霖铃声声慢
IO多路复用分为select,poll和epoll,文中描述的应该是select的过程,nigix,redis等使用的是epoll,所以光只看这个文章的话会比较迷惑,文中写的太粗了。 对于课后思考,目前很多的主流的需要通信的中间件都差不多都实现了零拷贝,如Kfaka,RocketMQ等。kafka的零拷贝是通过java.nio.channels.FileChannel中的transferTo方法来实现的,transferTo方法底层是基于操作系统的sendfile这个system call来实现的。

作者回复: 系统层面零拷贝跟应用层零拷贝还是需要区分的

2020-03-01
8
67
南桥畂翊
所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,可以通过一种方式,直接将数据写入内核或从内核中读取数据,再通过 DMA 将内核中的数据拷贝到网卡,或将网卡中的数据 copy 到内核。 老师,上述说直接将数据写入内核或从内核中读取数据,这部分内存不是属于内核态空间的吧?应该说只是一块物理内存,用户态虚拟地址和内核态虚拟地址都作了页表映射

作者回复: 是不太严谨,已改

2020-03-24
30
想出家的小和尚
老师,直接内存给我的概念很模糊,他指的到底是什么?和jvm中的堆内内存,堆外内存,用户空间,内核空间有什么关系?

作者回复: 用户空间和内核空间是系统层面划分的;堆内和堆外是针对jvm进程来讲的

2020-03-31
4
阿卧
阻塞IO: 1. 阻塞等待:多线程进行IO读取,需要阻塞等待 2. 内存两次拷贝:从设备(磁盘或者网络)拷贝到用户空间,再从用户空间拷贝到内核空间 IO多路复用 1. 一个复用器(selector)监听有多个通道(channel)。实现非阻塞式IO读取、写入 2. 内存直接拷贝(derict buffers),直接从用户空间拷贝到内核空间

作者回复: 很棒

2020-03-01
2
3
嘻嘻
老师,个人理解netty 堆在内存还是在用户态的,还是要拷贝到内核态啊,为啥零拷贝了?

作者回复: netty里面0更多是buffer类而言

2020-04-22
2
2
番茄炒西红柿
问一下nio和io多路复用的区别(我认为没区别吧),io多路复用不就是为了实现同步非阻塞?

作者回复: 本质上多路复用还是同步堵塞的

2020-04-08
3
2
高源
老师你讲的netty零拷贝不光做到在用户级别的,还有操作系统级别的,那老师如果我想理解它的怎么做的,因为它源代码看的迷糊,怎样把他实现的高技巧和方法运用到自己这块,灵活运用

作者回复: 看下netty的各常用的ChannlHandler和Bytebuf的实现。

2020-02-28
2
Mike
RocketMq中对消息的读取也用到了零拷贝

作者回复: 是的

2020-03-31
1
张先生
1.我的理解netty对应用层的零拷贝优化就是把做个tcp包做合并来减少频繁的cpu内核交互,但是cpu内核应该也有个大小限制吧? 2.零拷贝只是优化了服务器的开销,对于传输层并没有什么优化吧,因为传输层传输的包大小会受链路上路由可接收的包大小决定拆多少个包

作者回复: netty零拷贝有多种支持,包括它提供的很多buffer。在进行文件网络传输,也可以进行零拷贝的优化。在网络传输过程中没有优化。

2020-02-26
1
Jonah
典型的Kafka,Rocketmq等

作者回复: 是的

2020-04-08
收起评论