消息队列高手课
李玥
京东零售技术架构部资深架构师
立即订阅
8426 人已学习
课程目录
已完结 41 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | 优秀的程序员,你的技术栈中不能只有“增删改查”
免费
预习 | 怎样更好地学习这门课?
基础篇 (8讲)
01 | 为什么需要消息队列?
02 | 该如何选择消息队列?
03 | 消息模型:主题和队列有什么区别?
04 | 如何利用事务消息实现分布式事务?
05 | 如何确保消息不会丢失?
06 | 如何处理消费过程中的重复消息?
07 | 消息积压了该如何处理?
08 | 答疑解惑(一) : 网关如何接收服务端的秒杀结果?
进阶篇 (21讲)
09 | 学习开源代码该如何入手?
10 | 如何使用异步设计提升系统性能?
11 | 如何实现高性能的异步网络传输?
12 | 序列化与反序列化:如何通过网络传输结构化的数据?
13 | 传输协议:应用程序之间对话的语言
14 | 内存管理:如何避免内存溢出和频繁的垃圾回收?
加餐 | JMQ的Broker是如何异步处理消息的?
15 | Kafka如何实现高性能IO?
16 | 缓存策略:如何使用缓存来减少磁盘IO?
17 | 如何正确使用锁保护共享数据,协调异步线程?
18 | 如何用硬件同步原语(CAS)替代锁?
19 | 数据压缩:时间换空间的游戏
20 | RocketMQ Producer源码分析:消息生产的实现过程
21 | Kafka Consumer源码分析:消息消费的实现过程
22 | Kafka和RocketMQ的消息复制实现的差异点在哪?
23 | RocketMQ客户端如何在集群中找到正确的节点?
24 | Kafka的协调服务ZooKeeper:实现分布式系统的“瑞士军刀”
25 | RocketMQ与Kafka中如何实现事务?
26 | MQTT协议:如何支持海量的在线IoT设备?
27 | Pulsar的存储计算分离设计:全新的消息队列设计思路
28 | 答疑解惑(二):我的100元哪儿去了?
案例篇 (7讲)
29 | 流计算与消息(一):通过Flink理解流计算的原理
30 | 流计算与消息(二):在流计算中使用Kafka链接计算任务
31 | 动手实现一个简单的RPC框架(一):原理和程序的结构
32 | 动手实现一个简单的RPC框架(二):通信与序列化
33 | 动手实现一个简单的RPC框架(三):客户端
34 | 动手实现一个简单的RPC框架(四):服务端
35 | 答疑解惑(三):主流消息队列都是如何存储消息的?
测试篇 (2讲)
期中测试丨10个消息队列热点问题自测
免费
期末测试 | 消息队列100分试卷等你来挑战!
结束语 (1讲)
结束语 | 程序员如何构建知识体系?
消息队列高手课
登录|注册

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

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

如何来动态地生成桩?

RPC 框架中的这种桩的设计,它其实采用了一种设计模式:“代理模式”。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,被代理的那个对象称为委托对象。
在 RPC 框架中,代理对象都是由 RPC 框架的客户端来提供的,也就是我们一直说的“桩”,委托对象就是在服务端,真正实现业务逻辑的服务类的实例。
我们最常用 Spring 框架,它的核心 IOC(依赖注入)和 AOP(面向切面)机制,就是这种代理模式的一个实现。我们在日常开发的过程中,可以利用这种代理模式,在调用流程中动态地注入一些非侵入式业务逻辑。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《消息队列高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(6)

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

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

    2019-10-24
    1
    5
  • leslie
    明确的知道自己的问题后再补开发语言那块的漏、、、课程拉了3节:看来一个人的精力还是有限,完全不拉的跟了30节后面还是拉下了课程,动手这块只能利用双休日再争取补上一点了。。。
    2019-10-11
    2
  • wzzJike
    java的很多框架使用的都是jdk的动态代理吧,能获取到代理类,调用方法,参数信息

    作者回复: 是这样的。

    2019-10-10
    2
  • 亚洲舞王.尼古拉斯赵四
    嘻嘻,开心,成功支持任意数目方法,任意返回值类型,接口成功调用并正确工作,其实这个作业就是一个循环遍历的过程,然后将每个方法的返回值,方法名替换的过程
    2019-11-07
    1
  • Switch
    基本类型暂未实现,
    https://github.com/Switch-vov/simple-rpc-framework/tree/feature-stub

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

    2019-11-02
    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
    1
收起评论
6
返回
顶部