创建代理对象
com.alibaba.dubbo.config.ReferenceConfig#createProxy
通过消费者get()方法可以找到以上方法,消费者需要根据配置的接口生成代理对象。 ###协议生成Invoker ####DubboProtocol
public <T> Invoker<T> refer(Class<T> serviceType, URL url) throws RpcException {
// create rpc invoker.
DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);
invokers.add(invoker);
return invoker;
}
以上通过Url获取客户端信息。
以上红框中是rpc层与remote层的转换。requestHandler是一个抽象类。
####Invoker生成代理对象 dubbo使用代理工厂来生成代理对象,dubbo默认使用的JavassistProxyFactory来生成代理对象。
com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory
上图为代理工厂生成的代理对象的方法,此方法生成代理比较隐晦,因为dubbo通过字符串的拼接,生成java类,最后由javasist加载字节码,以下代码大概给出一个生成的代理class,可能细节不太一样,这里只是给出重要信息而已。
public class com.alibaba.dubbo.common.bytecode.Proxyid extend Proxy {
public Object newInstance(InvocationHandler h) {
return new className.proxyid(h); }
}
}
public class className.proxyid implements interface1, interface2 {
public static java.lang.reflect.Method[] methods = new Method[2];
private InvocationHandler handler;
public className.proxyid () {
}
public className.proxyid (InvocationHandler arg0) {
handler=arg0;
}
public Boolean method1(String arg0, Integer arg1) throws Exception {
Object[] args = new Object[2];
args[0] = arg0;
args[1] = arg1;
Object ret = handler.invoke(this, methods[0], args);
return ret ==null?false:((Boolean) ret).booleanValue();
}
public Byte method2(String arg0, Integer arg1) {
Object[] args = new Object[2];
args[0] = arg0;
args[1] = arg1;
Object ret = handler.invoke(this, methods[1], args);
return ret ==null?(byte)0:((Byte) ret).byteValue();
}
}
以上产生了一个代理对象,代理对象根据相应的方法会动态生成上述代码中method1和method2等,对应接口的方法,而method1方法会调用com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler#invoke方法,InvokerInvocationHandler类中封装了Invoker(DubboInvoker),通过Invoker把相应的方法及参数值传递,获取对应的返回结果。至此消费者生成代理及调用过程完成了。