33 | 动手实现一个简单的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
《消息队列高手课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(9)
- 最新
- 精选
- Gred1.改用CGLib动态代理,增加多接口多方法支持。 2.增加Object序列化类以及默认序列化类,增加对多入参的序列化支持。 借花献佛了,麻烦老师指导下 https://github.com/Gred01/simple-rpc-framework
作者回复: 我是第一个Star这个项目的人哦!
2019-10-24430 - Switch基本类型暂未实现, https://github.com/Switch-vov/simple-rpc-framework/tree/feature-stub
作者回复: 大致浏览一下代码,思路是没问题的,非常棒!
2019-11-025 - wzzJikejava的很多框架使用的都是jdk的动态代理吧,能获取到代理类,调用方法,参数信息
作者回复: 是这样的。
2019-10-103 - Khirye老师,我想请教一个问题。您的文章中写道:“那能不能用一个第三方来创建这个实现类呢?也是不行的,即使用一个第三方类来创建实现,那依赖关系就变成了:调用方依赖第三方类,第三方类依赖实现类,调用方还是间接依赖实现类,还是没有解耦”,那么请问SPI跟“一个第三方来创建实现类”这个行为本质上有什么区别呢。我的理解是SPI本质上也是“创建”了一个类。还望老师解惑🙏
作者回复: SPI本质上是动态创建依赖接口的实现类,解决问题的就是“解耦”接口的调用方对接口实现类的依赖。
2019-12-3131 - 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-105
- leslie明确的知道自己的问题后再补开发语言那块的漏、、、课程拉了3节:看来一个人的精力还是有限,完全不拉的跟了30节后面还是拉下了课程,动手这块只能利用双休日再争取补上一点了。。。2019-10-112
- 张三案例篇太精彩了2020-09-101
- 亚洲舞王.尼古拉斯赵四嘻嘻,开心,成功支持任意数目方法,任意返回值类型,接口成功调用并正确工作,其实这个作业就是一个循环遍历的过程,然后将每个方法的返回值,方法名替换的过程2019-11-071
- ifelse棒👍🏻2023-01-11归属地:浙江
收起评论