RPC实战与核心原理
何小锋
京东技术架构部首席架构师
立即订阅
3762 人已学习
课程目录
已更新 8 讲 / 共 28 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 别老想着怎么用好RPC框架,你得多花时间琢磨原理
免费
基础篇 (6讲)
01 | 核心原理:能否画张图解释下RPC的通信流程?
02 | 协议:怎么设计可扩展且向后兼容的协议?
03 | 序列化:对象怎么在网络中传输?
04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型?
05 | 动态代理:面向接口编程,屏蔽RPC处理流程
06 | RPC实战:剖析gRPC源码,动手实现一个完整的RPC
进阶篇 (1讲)
07 | 架构设计:设计一个灵活的RPC框架
RPC实战与核心原理
登录|注册

05 | 动态代理:面向接口编程,屏蔽RPC处理流程

何小锋 2020-02-28
你好,我是何小锋。上一讲我分享了网络通信,其实要理解起来也很简单,RPC 是用来解决两个应用之间的通信,而网络则是两台机器之间的“桥梁”,只有架好了桥梁,我们才能把请求数据从一端传输另外一端。其实关于网络通信,你只要记住一个关键字就行了——可靠的传输。
那么接着上一讲的内容,我们再来聊聊动态代理在 RPC 里面的应用。
如果我问你,你知道动态代理吗? 你可能会如数家珍般地告诉我动态代理的作用以及好处。那我现在接着问你,你在项目中用过动态代理吗?这时候可能有些人就会犹豫了。那我再换一个方式问你,你在项目中有实现过统一拦截的功能吗?比如授权认证、性能统计等等。你可能立马就会想到,我实现过呀,并且我知道可以用 Spring 的 AOP 功能来实现。
没错,进一步再想,在 Spring AOP 里面我们是怎么实现统一拦截的效果呢?并且是在我们不需要改动原有代码的前提下,还能实现非业务逻辑跟业务逻辑的解耦。这里的核心就是采用动态代理技术,通过对字节码进行增强,在方法调用的时候进行拦截,以便于在方法调用前后,增加我们需要的额外处理逻辑。
那话说回来,动态代理跟 RPC 又有什么关系呢?

远程调用的魔法

我说个具体的场景,你可能就明白了。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《RPC实战与核心原理》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(12)

  • 李玥
    我在工作中有幸看了不少小锋老师的代码,京东很多的基础类库中,都有小峰老师的代码。从中学到了很多。包括文章中提到的对调用方尽量屏蔽实现细节的思想,以及通过定义扩展点来剥离实现等等。
    2020-02-29
    2
    15
  • 邵邵
    这一节RPC讲解重度依赖java知识,希望老师在后续的文章中多提炼一些跨语言层面的原理,或者用一些伪代码的方式讲解,谢谢
    2020-03-01
    6
  • 忆水寒
    其实也是看需求的。如果没有动态代理,那么调用双方可以通过定义一套消息id和消息结构(才有protobuf定义),也是可以完成远程调用的。
    2020-03-01
    2
  • 如果没有动态代理帮我们完成方法调用拦截,那么就需要使用静态代理来实现,就需要用户对原始类中所有的方法都重新实现一遍,并且为每个方法附加相似的代码逻辑,如果在RPC中,这种需要代理的类有很多个,就需要针对每个类都创建一个代理类。
    2020-03-01
    1
  • 每天晒白牙
    如果没有动态代理类帮我们完成方法调用拦截,需要用户自己加入远程调用的逻辑,这样就麻烦,且使用不方便了

    作者回复: 是的,动态代理让用户API调用透明

    2020-02-28
    2
    1
  • Json Dumps
    看到过,GRPC,通过proto接口,生成了客户端静态代理代码。
    与动态代理相比,接口变化除了更新接口文件,还要重新生成静态代理代码,并更新。
    为什么非要动态代理呢?优点是什么?
    2020-03-02
  • Jackey
    动态代理真是个神奇的技术,没有它的话用户就得自己写远程调用的实现了。
    ps:SpringAOP也无从谈起了
    2020-03-01
  • cricket1981
    没有动态代理的话就只能用静态代理了
    2020-03-01
  • wusiration
    如果没有动态代理完成方法拦截,那么被调用方需要有调用方的接口实现,就失去了面向接口编程的意义
    2020-02-28
  • 高源
    还有老师我有个问题请教,对于程序里已经加了必要日志来排出问题,今天发现日志没有异常情况,但是出现了现象就是服务端一直开着,客户端大概10个左右当天关闭了,第二天连接服务端时候发现就1个客户端发生底层连接上了服务端之间socket通信,但是没有正确进入业务逻辑处理,出现问题1个客户端是随机发生的。重启服务端就好了。这个问题怎么排查,客户端嵌入式Linux,服务端win双方tcp socket通讯
    2020-02-28
  • 高源
    请教老师,例如算法和开源框架源代码,你是如何学习深入理解的,毕竟我的想法自己能够灵活运用,个人能力有限的
    2020-02-28
  • hello
    Byte Buddy,老师这个后起之秀,是怎么完成动态代理的,能否剖析下,多谢!

    作者回复: 相比于其他框架,其API还是很简单的。举个例子:Class<? extends T> clazz = BYTE_BUDDY.subclass(clz)
                    .method(ElementMatchers.isDeclaredBy(clz))
                    .intercept(MethodDelegation.to(new ByteBuddyInvocationHandler(invoker)))
                    .make()
                    .load(classLoader, ClassLoadingStrategy.Default.INJECTION)
                    .getLoaded();
            try {
                return clazz.newInstance();
            } catch (Exception e) {
                throw new ProxyException("Error occurred while creating bytebuddy proxy of " + clz.getName(), e);
            }

    2020-02-28
收起评论
12
返回
顶部