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

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

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

远程调用的魔法

我说个具体的场景,你可能就明白了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《RPC 实战与核心原理》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(40)

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

    作者回复: 很棒

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

    作者回复: 很棒

    14
  • 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); }

    14
  • tongmin_tsai
    老师,可以理解为,动态代理生成的类,就是stub吗?

    作者回复: 作用是一样的

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

    作者回复: 很棒

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

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

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

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

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

    作者回复: 现在可以了

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

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

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

    作者回复: 是的

    1
收起评论
显示
设置
留言
40
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部