浅谈动态代理在 RPC 中的应用
浅谈动态代理在 RPC 中的应用
远程调用魔法
话说动态代理在 RPC 中有啥作用呢?
在项目中,当我们要使用 RPC 的时候,一般的做法是 先找服务提供方要接口,通过 Maven 等工具把接口依赖到我们项目中。如果要调用提供方的接口,就只需要通过依赖注入的方式把接口注入到项目中就行了,然后在代码里面直接调用接口的方法。
但是接口里并不包含真实的业务逻辑,业务逻辑都在服务提供方应用里面,但我们通过调用接口方法,拿到了我们想要的结果,那在 RPC 中这是怎么完成的呢,答案就是动态代理。
RPC 会自动给我们生成一个动态代理类,当我们在项目中注入接口的时候,运行过程中实际绑定是这个接口生成的代理类,这样在接口方法被调用的时候,它实际上是被生成代理类拦截了,这样我们就可以在生成的代理类里面,加入远程调用的逻辑。
通过这种方式就可以帮助用户屏蔽远程调用的细节,实现像调用本地方法一样调用远程的体验,流程如下:
动态代理有多种方式,常见的就是 JDK 的动态代理和 CGLIB 动态代理,那我们应该选择哪种呢?
- 因为代理类是在运行中生成的,那么代理框架生成代理类的速度、生成代理类的字节码大小等等,都会影响到其性能--生成的字节码越小,运行所占资源就越小。
- 我们生成的代理类,适用于接口请求拦截的,所以每次调用接口方法的时候,都会执行生成的代理类,所以代理类的执行效率需要很高效。
- 该动态代理框架的 API 是否好理解,社区活跃度等等。