在上一篇文章中,讲解了反射 与动态代理基本概念,没有看过点击此传送门。
接下来看看,动态代理在RPC中是如何使用的。在讲解过程中会去除掉一些无关的代码,如果读者相应看全部的代码,可以去开源项目的仓库中下载相关源码,进一步的专研,以下也会给出链接。
实例
1.第一个实例取自黄勇的轻量级分布式 RPC 框架 ,由于实现中通信框架使用了Netty,所以在分析中会有部分Netty代码的信息,不过不用担心,即使不懂Netty,讲解的过程中会尽量避免,并会突出反射与动态代理在其中的作用。
在rpc-simple-client中HelloClient.Class有如下代码
HelloService helloService = rpcProxy.create(HelloService.class);
String result = helloService.hello("World");
System.out.println(result);
这个代码做的是什么事呢?通过一个代理生成helloService对象,执行hello方法。
在我们印象中执行方法,最终都会执行的是接口中实现的方法。那事实是这样吗?看下面的分析。
在rpcProxy代码如下:
public <T> T create(final Class<?> interfaceClass, final String serviceVersion) {
// 创建动态代理对象
return (T) Proxy.newProxyInstance(
interfaceClass.getClassLoader(),
new Class<?>[]{interfaceClass},
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 创建 RPC 请求对象并设置请求属性
RpcRequest request = new RpcRequest();
request.setRequestId(UUID.randomUUID().toString());
request.setInterfaceName(method.getDeclaringClass().getName());
request.setServiceVersion(serviceVersion);
request.setMethodName(method.getName());
request.setParameter