RPC实战与核心原理
何小锋
京东技术架构部首席架构师
立即订阅
3885 人已学习
课程目录
已更新 16 讲 / 共 28 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
免费
基础篇 (6讲)
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
进阶篇 (9讲)
07 | 架构设计:设计一个灵活的RPC框架
08 | 服务发现:到底是要CP还是AP?
09 | 健康检测:这个节点都挂了,为啥还要疯狂发请求?
10 | 路由策略:怎么让请求按照设定的规则发到不同的节点上?
11 | 负载均衡:节点负载差距这么大,为什么收到的流量还一样?
12 | 异常重试:在约定时间内安全可靠地重试
13 | 优雅关闭:如何避免服务停机带来的业务损失?
14 | 优雅启动:如何避免流量打到没有启动完成的节点?
15 | 熔断限流:业务如何实现自我保护?
RPC实战与核心原理
登录|注册

07 | 架构设计:设计一个灵活的RPC框架

何小锋 2020-03-04
你好,我是何小锋。到今天为止,基础篇的知识我们就全部学习完了,接下来我们进入进阶篇。
在基础篇里面,我们讲了 RPC 的通信原理以及 RPC 里各个功能组件的作用,不妨用一段话再次回顾下:“其实 RPC 就是把拦截到的方法参数,转成可以在网络中传输的二进制,并保证在服务提供方能正确地还原出语义,最终实现像调用本地一样地调用远程的目的。”你记住了吗?
那学到这儿,距离实现一个灵活的 RPC 框架其实还是有距离的。知道了各个功能组件只是迈出了第一步,接下来你必须要清楚各个组件之间是怎么完成数据交互的,这也是今天这讲的重点,我们一起搞清楚 RPC 的架构设计。

RPC 架构

说起架构设计,我相信你一定不陌生。我理解的架构设计呢,就是从顶层角度出发,厘清各模块组件之间数据交互的流程,让我们对系统有一个整体的宏观认识。我们先看看 RPC 里面都有哪些功能模块。
我们讲过,RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据。虽然传输协议可以有多种选择,但考虑到可靠性的话,我们一般默认采用 TCP 协议。为了屏蔽网络传输的复杂性,我们需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模块我们可以叫做传输模块。
用户请求的时候是基于方法调用,方法出入参数都是对象数据,对象是肯定没法直接在网络中传输的,我们需要提前把它转成可传输的二进制,这就是我们说的序列化过程。但只是把方法调用参数的二进制数据传输到服务提供方是不够的,我们需要在方法调用参数的二进制数据后面增加“断句”符号来分隔出不同的请求,在两个“断句”符号中间放的内容就是我们请求的二进制数据,这个过程我们叫做协议封装。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《RPC实战与核心原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • cricket1981
    如何实现按需加载的SPI?

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

    2020-03-04
    2
    4
  • Darren
    插件功能都可以通过类似链式调用的方式实现,可以全量加载,但按需激活,不管是condition还是SPI,然后把所有激活的保存在List中,然后执行的时候,通过链式的形式调用
    2020-03-17
    1
  • 楼下小黑哥
    我们系统中有个路由模块,可以分发交易到指定交易渠道。新接入的模块,只需要接入规定的接口,就能被路由模块识别到。
    我觉得这也是类似于插件化开发,每次新接入交易渠道,路由模块都是无需重启。

    作者回复: 很棒!

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

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

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

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

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

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

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

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

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

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

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

    作者回复: 很棒

    2020-03-05
  • 艾斯曼
    目前工作是为工业设备联网数据采集,设备种类和型号繁多,产品中通过抽象出一套“驱动”的概念,把每类设备当作一个插件开发,整体产品架构不变,感觉有点这个概念。只是产品还不够大,其他插件体系还不够明确。

    作者回复: 很棒

    2020-03-04
收起评论
10
返回
顶部