动态代理在RPC中的运用

​ 动态代理在 RPC 框架的实现中起到了至关重要的作用,它可以帮助用户屏蔽 RPC 调用时底层网络通信、服务发现、负载均衡等具体细节。

1 动态代理基础

​ 代理模式的优势是可以很好地遵循设计模式中的开放封闭原则,对扩展开发,对修改关闭。

​ 动态代理是一种代理模式,它提供了一种能够在运行时动态构建代理类以及动态调用目标方法的机制。代理类可以看作是对被代理对象的包装,对目标方法的调用是通过代理类来完成的。所以通过代理模式可以有效地将服务提供者和服务消费者进行解耦,隐藏了 RPC 调用的具体细节。

image-20220306202205168

JDK动态代理

JDK 动态代理实现依赖 java.lang.reflect 包中的两个核心类:InvocationHandler 接口Proxy 类

  • InvocationHandler 接口

    ​ JDK 动态代理所代理的对象必须实现一个或者多个接口,生成的代理类也是接口的实现类,然后通过 JDK 动态代理是通过反射调用的方式代理类中的方法,不能代理接口中不存在的方法。

    ​ 每一个动态代理对象必须提供 InvocationHandler 接口的实现类,InvocationHandler 接口中只有一个 invoke() 方法。当我们使用代理对象调用某个方法的时候,最终都会被转发到 invoke() 方法执行具体的逻辑

  • Proxy 类

    ​ Proxy 类可以理解为动态创建代理类的工厂类,它提供了一组静态方法和接口用于动态生成对象和代理类。

Cglib动态代理

​ Cglib 动态代理是基于 ASM 字节码生成框架实现的第三方工具类库,相比于 JDK 动态代理,Cglib 动态代理更加灵活,它是通过字节码技术生成的代理类,所以代理类的类型是不受限制的。使用 Cglib 代理的目标类无须实现任何接口,可以做到对目标类零侵入。

​ Cglib 动态代理是对指定类以字节码的方式生成一个子类,并重写其中的方法,以此来实现动态代理。因为 Cglib 动态代理创建的是目标类的子类,所以目标类必须要有无参构造函数,而且目标类不要用 final 进行修饰

Cglib 动态代理的实现需要依赖两个核心组件:MethodInterceptor 接口和 Enhancer

  • MethodInterceptor 接口

    ​ MethodInterceptor 接口只有 intercept() 一个方法,所有被代理类的方法执行最终都会转移到 intercept() 方法中进行行为增强,真实方法的执行逻辑则通过 Method 或者 MethodProxy 对象进行调用。

  • Enhancer 类

    ​ Enhancer 类是 Cglib 中的一个字节码增强器,它为我们对代理类进行扩展时提供了极大的便利。Enhancer 类的本质是在运行时动态为代理类生成一个子类,并且拦截代理类中的所有方法。

参考

(121条消息) jdk动态代理invoke方法自动运行原因_码到的博客-CSDN博客_动态代理invoke

[27 动态代理:为用户屏蔽 RPC 调用的底层细节.md (lianglianglee.com)](https://learn.lianglianglee.com/专栏/Netty 核心原理剖析与 RPC 实践-完/27 动态代理:为用户屏蔽 RPC 调用的底层细节.md)


动态代理在RPC中的运用
https://2w1nd.github.io/2022/03/06/框架/RPC/动态代理在RPC中的运用/
作者
w1nd
发布于
2022年3月6日
许可协议