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

视频资源获取失败

开篇词 | 别老想着怎么用好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 框架其实还是有距离的。知道了各个功能组件只是迈出了第一步,接下来你必须要清楚各个组件之间是怎么完成数据交互的,这也是今天这讲的重点,我们一起搞清楚 RPC 的架构设计。

RPC 架构

说起架构设计,我相信你一定不陌生。我理解的架构设计呢,就是从顶层角度出发,厘清各模块组件之间数据交互的流程,让我们对系统有一个整体的宏观认识。我们先看看 RPC 里面都有哪些功能模块。

我们讲过,RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据。虽然传输协议可以有多种选择,但考虑到可靠性的话,我们一般默认采用 TCP 协议。为了屏蔽网络传输的复杂性,我们需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模块我们可以叫做传输模块。

用户请求的时候是基于方法调用,方法出入参数都是对象数据,对象是肯定没法直接在网络中传输的,我们需要提前把它转成可传输的二进制,这就是我们说的序列化过程。但只是把方法调用参数的二进制数据传输到服务提供方是不够的,我们需要在方法调用参数的二进制数据后面增加“断句”符号来分隔出不同的请求,在两个“断句”符号中间放的内容就是我们请求的二进制数据,这个过程我们叫做协议封装。

登录 后留言

全部留言(26)

  • 最新
  • 精选
cricket1981
如何实现按需加载的SPI?

作者回复: 可以参考springboot的Condition实现

2020-03-04
4
21
楼下小黑哥
我们系统中有个路由模块,可以分发交易到指定交易渠道。新接入的模块,只需要接入规定的接口,就能被路由模块识别到。 我觉得这也是类似于插件化开发,每次新接入交易渠道,路由模块都是无需重启。

作者回复: 很棒!

2020-03-06
3
15
这篇感觉很棒,高屋建瓴,一个完整的RPC架构设计图就出来了。每个部分具体怎么实现就因人因公司而异了,不过也是见证功力的地方,目前在研究thrift,感觉很有帮助。

作者回复: 希望能帮助到你

2020-05-14
2
7
鸠摩智
阿里开源的datax也用到了插件的设计

作者回复: 现在很多开源框架都用到了插件

2020-04-09
1
Geek_9ius3m
我是个小测试。使用jmeter进行压力测试。jmeter官网中支持进行定制sampler取样器,写好的jar包放在lib\ext下,再启动jmter时就能看到了。不知道这算不算插件化开发

作者回复: 插件化是一个概念,有很多种实现方式,这种也可以算。

2020-03-22
1
Dovelol
还有spring的spring.factories这一套也是利用的面向接口编程的思想吧,感觉这个比jdk自带的spi也好很多,既然有些问题,那为啥jdk的spi不优化一下呢?

作者回复: jdk我理解更多是标准

2020-03-11
1
凹凸
插件功能目前在我的产品中任务引擎也是通过spi和spring注入两种方式,确实做不到按需加载,这个可以优化下。

作者回复: 是的,可以考虑自己实现一个

2020-03-08
1
雨霖铃声声慢
看到这个问题首先想到的是用过的一些框架工具的中间件结构,这些中间件应该也是插件的一种,比如django的middleware和ror的各种gem包,都可以给框架提供强大的扩展功能。

作者回复: 很棒

2020-03-05
1
Dovelol
老师好,想问下用jdk自带spi一般会有一个接口加载很多实现类的情况吗,因为只能用迭代器遍历,导致只能用类型判断才能找到自己想要的类,这样感觉不够优雅吧,所以我感觉应该都是一个接口配置一个实现类这样就是使用者想要的情况了

作者回复: 那样插件的意义就不存在了

2020-03-11
奔奔奔跑
太好了,这章内容!请问老师我可以对照这张内容和RPC微内核架构图去阅读gRPC的源码吗?我想从源码中学习收获一定非常大!

编辑回复: 你可以看下第6讲

2020-03-06
收起评论