消息队列高手课
李玥
美团高级技术专家
52199 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
进阶篇 (21讲)
消息队列高手课
15
15
1.0x
00:00/00:00
登录|注册

33 | 动手实现一个简单的RPC框架(三):客户端

加载到JVM
动态编译
生成源代码
扩展RPC框架客户端
SPI(Service Provider Interface)
面向接口编程
动态生成桩的原理
Dubbo的运行时动态生成桩
gRPC的编译IDL生成桩
createStub方法
Spring框架的IOC和AOP机制
代理模式
思考题
依赖倒置原则
动态生成桩
桩工厂接口
桩的实现原理
动手实现一个简单的RPC框架(三):客户端
参考文章

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

你好,我是李玥。
上节课我们已经一起实现了这个 RPC 框架中的两个基础组件:序列化和网络传输部分,这节课我们继续来实现这个 RPC 框架的客户端部分。
在《31 | 动手实现一个简单的 RPC 框架(一):原理和程序的结构》这节课中我们提到过,在 RPC 框架中,最关键的就是理解“桩”的实现原理,桩是 RPC 框架在客户端的服务代理,它和远程服务具有相同的方法签名,或者说是实现了相同的接口,客户端在调用 RPC 框架提供的服务时,实际调用的就是“桩”提供的方法,在桩的实现方法中,它会发请求到服务端获取调用结果并返回给调用方。
在 RPC 框架的客户端中,最关键的部分,也就是如何来生成和实现这个桩。

如何来动态地生成桩?

RPC 框架中的这种桩的设计,它其实采用了一种设计模式:“代理模式”。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,被代理的那个对象称为委托对象。
在 RPC 框架中,代理对象都是由 RPC 框架的客户端来提供的,也就是我们一直说的“桩”,委托对象就是在服务端,真正实现业务逻辑的服务类的实例。
我们最常用 Spring 框架,它的核心 IOC(依赖注入)和 AOP(面向切面)机制,就是这种代理模式的一个实现。我们在日常开发的过程中,可以利用这种代理模式,在调用流程中动态地注入一些非侵入式业务逻辑。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了在RPC框架中实现客户端部分的关键技术,重点讲解了动态生成桩的原理和实现方式。作者首先介绍了代理模式在RPC框架中的应用,以及在Spring框架中的实现方式。随后详细讲解了如何动态生成桩,包括定义桩工厂接口和实现动态生成桩的代码。文章还提到了依赖倒置原则在解耦调用者和实现中的应用,以及使用SPI(Service Provider Interface)来解决实现类实例创建的问题。总结时,强调了动态代理设计模式在RPC框架中的重要性,并鼓励读者掌握其实现原理。最后,提出了思考题,鼓励读者通过动手实践来加深对所学知识的理解。整篇文章内容丰富,对于想要深入了解RPC框架技术细节的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《消息队列高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • Gred
    1.改用CGLib动态代理,增加多接口多方法支持。 2.增加Object序列化类以及默认序列化类,增加对多入参的序列化支持。 借花献佛了,麻烦老师指导下 https://github.com/Gred01/simple-rpc-framework

    作者回复: 我是第一个Star这个项目的人哦!

    2019-10-24
    4
    30
  • Switch
    基本类型暂未实现, https://github.com/Switch-vov/simple-rpc-framework/tree/feature-stub

    作者回复: 大致浏览一下代码,思路是没问题的,非常棒!

    2019-11-02
    5
  • wzzJike
    java的很多框架使用的都是jdk的动态代理吧,能获取到代理类,调用方法,参数信息

    作者回复: 是这样的。

    2019-10-10
    3
  • Khirye
    老师,我想请教一个问题。您的文章中写道:“那能不能用一个第三方来创建这个实现类呢?也是不行的,即使用一个第三方类来创建实现,那依赖关系就变成了:调用方依赖第三方类,第三方类依赖实现类,调用方还是间接依赖实现类,还是没有解耦”,那么请问SPI跟“一个第三方来创建实现类”这个行为本质上有什么区别呢。我的理解是SPI本质上也是“创建”了一个类。还望老师解惑🙏

    作者回复: SPI本质上是动态创建依赖接口的实现类,解决问题的就是“解耦”接口的调用方对接口实现类的依赖。

    2019-12-31
    3
    1
  • A9
    解除参数和返回值的限制,意味着序列化模块要支持任意类,这就需要实现一套通用的序列化协议或在serialize模块中实现用到的所有类型。假设依旧使用自定义协议,并且用到的所有类型均实现了序列化接口。需要进行如下修改: 1.DynamicStubFactory#createStub的Method处理,使用getMethods获取method数组,for循环处理method而不是直接去数组下标0 2.把DynamicStubFactory的类代码模板进行拆分,分为类模板和方法模板,先生成所有method的代码,再以此生成整个类的代码 3.定义一个新的协议结构用来存放函数的参数,用此类型代替RpcRequest的serializedArguments变量,并修改RpcRequest的序列化相关函数 4.修改RpcRequestHandler#handle:52行内根据rpcRequest去取得实际method的函数,获取任意参数个数和类型的对应函数
    2019-10-10
    5
  • leslie
    明确的知道自己的问题后再补开发语言那块的漏、、、课程拉了3节:看来一个人的精力还是有限,完全不拉的跟了30节后面还是拉下了课程,动手这块只能利用双休日再争取补上一点了。。。
    2019-10-11
    2
  • 张三
    案例篇太精彩了
    2020-09-10
    1
  • 亚洲舞王.尼古拉斯赵四
    嘻嘻,开心,成功支持任意数目方法,任意返回值类型,接口成功调用并正确工作,其实这个作业就是一个循环遍历的过程,然后将每个方法的返回值,方法名替换的过程
    2019-11-07
    1
  • ifelse
    棒👍🏻
    2023-01-11归属地:浙江
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部