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

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

微内核架构
SPI服务发现机制
插件化架构
Bootstrap模块
压缩功能
协议模块
协议封装
序列化过程
数据传输模块
插件思想在日常工作中的应用
系统的可扩展性
软件架构设计的意义
可扩展的架构
RPC架构
课后思考
总结
架构设计

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

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

RPC 架构

说起架构设计,我相信你一定不陌生。我理解的架构设计呢,就是从顶层角度出发,厘清各模块组件之间数据交互的流程,让我们对系统有一个整体的宏观认识。我们先看看 RPC 里面都有哪些功能模块。
我们讲过,RPC 本质上就是一个远程调用,那肯定就需要通过网络来传输数据。虽然传输协议可以有多种选择,但考虑到可靠性的话,我们一般默认采用 TCP 协议。为了屏蔽网络传输的复杂性,我们需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模块我们可以叫做传输模块。
用户请求的时候是基于方法调用,方法出入参数都是对象数据,对象是肯定没法直接在网络中传输的,我们需要提前把它转成可传输的二进制,这就是我们说的序列化过程。但只是把方法调用参数的二进制数据传输到服务提供方是不够的,我们需要在方法调用参数的二进制数据后面增加“断句”符号来分隔出不同的请求,在两个“断句”符号中间放的内容就是我们请求的二进制数据,这个过程我们叫做协议封装。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇文章介绍了如何设计一个灵活的RPC框架,从基础知识到架构设计的各个功能模块进行了详细讲解。首先介绍了RPC的基础知识,包括通信原理和功能组件作用。接着详细讲解了RPC架构设计的各个功能模块,包括传输模块、序列化过程、协议封装、压缩功能以及Bootstrap模块。随后,文章提到了集群能力和服务治理的重要性,并介绍了服务发现和连接管理器的作用。最后,文章讨论了插件化架构的实现方式,以及其带来的优势。通过这些内容,读者可以快速了解RPC框架的设计原理和架构特点,以及如何实现灵活的插件化架构。文章内容深入浅出,适合技术人员阅读学习。

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

全部留言(25)

  • 最新
  • 精选
  • 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
  • 麦兜布熊
    我是个小测试。使用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
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部