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

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

动态代理在RPC中的重要性
选型考虑角度
第三方框架:Javassist、Byte Buddy
JDK默认的InvocationHandler
代理类的生成过程
Java中的动态代理示例
RPC中的代理类生成
统一拦截功能实现
屏蔽RPC处理流程
没有动态代理时的RPC调用
动态代理在RPC中的重要性
Byte Buddy
Javassist
JDK默认的代理功能
JDK的源码分析
代理类的生成
动态代理的核心技术
RPC中的使用场景
总结
实现方法
实现原理
应用
作用
课后思考
总结
实现方法
实现原理
远程调用的魔法
动态代理
参考文章

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

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

远程调用的魔法

我说个具体的场景,你可能就明白了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

动态代理在RPC中的应用是一种技术手段,能够帮助开发者实现远程调用的透明化,提高了系统的可维护性和可扩展性。通过动态代理技术,RPC能够自动生成接口的代理类,实现远程调用的逻辑,使得远程调用的体验就像调用本地一样。文章详细介绍了动态代理的概念、作用以及在RPC中的应用场景,并以Java为例,解释了动态代理的实现原理,包括代理类的生成和方法调用的转发过程。此外,还介绍了其他第三方框架如Javassist、Byte Buddy等的代理功能,以及在性能和使用上的差异。总的来说,动态代理在RPC中的应用能够帮助用户屏蔽RPC调用细节,提供像调用本地一样的编程体验,同时也提供了选型的角度供开发者考虑,从性能、执行效率和使用便捷性等方面进行评估。文章最后强调了动态代理的重要性,使得用户可以不用关注细节,类似于日常设计接口时的屏蔽细节的思路。

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

全部留言(41)

  • 最新
  • 精选
  • 雨霖铃声声慢
    如果没有动态代理帮我们完成方法调用拦截,那么就需要使用静态代理来实现,就需要用户对原始类中所有的方法都重新实现一遍,并且为每个方法附加相似的代码逻辑,如果在RPC中,这种需要代理的类有很多个,就需要针对每个类都创建一个代理类。

    作者回复: 很棒

    2020-03-01
    2
    35
  • 楼下小黑哥
    没有动态代理的情况下,最简单的情况, 服务消费者将类信息序列化---》按照协议拼接报文----》调用网络程序发送报文----》收到提供者返回信息----》根据协议解析出返回信息-----》再反序列化成返回结果。 上面每一步都挺复杂的,RPC 框架使用动态代理帮我们屏蔽这种细节。

    作者回复: 很棒

    2020-03-06
    15
  • 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
    14
  • tongmin_tsai
    老师,可以理解为,动态代理生成的类,就是stub吗?

    作者回复: 作用是一样的

    2020-04-26
    5
  • 番茄炒西红柿
    为什么不用静态代理?aspectJ之类的。提前把代理类在编译的时候创建?

    作者回复: 理论上编译期创建是可以的,但实际问题就是怎么确定哪些需要创建呢

    2020-04-08
    3
  • wusiration
    如果没有动态代理完成方法拦截,那么被调用方需要有调用方的接口实现,就失去了面向接口编程的意义

    作者回复: 很棒

    2020-02-28
    4
    3
  • 每天晒白牙
    如果没有动态代理类帮我们完成方法调用拦截,需要用户自己加入远程调用的逻辑,这样就麻烦,且使用不方便了

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

    2020-02-28
    3
    3
  • 阿卧
    从动态代理的原理和特点出发。动态代理帮我们生成代理类,屏蔽具体实现细节,在代理方法前实现统一封装。 如果没有动态代理,就需要手动实现每个接口类的远程调用细节了。 被面试官问到这个问题,没有回答上来...

    作者回复: 现在可以了

    2020-03-16
    2
  • Json Dumps
    看到过,GRPC,通过proto接口,生成了客户端静态代理代码。 与动态代理相比,接口变化除了更新接口文件,还要重新生成静态代理代码,并更新。 为什么非要动态代理呢?优点是什么?

    作者回复: 动态代理可以面向接口编程

    2020-03-02
    2
  • Jackey
    动态代理真是个神奇的技术,没有它的话用户就得自己写远程调用的实现了。 ps:SpringAOP也无从谈起了

    作者回复: 是的

    2020-03-01
    2
收起评论
显示
设置
留言
41
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部