博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo消费者
阅读量:6757 次
发布时间:2019-06-26

本文共 2089 字,大约阅读时间需要 6 分钟。

hot3.png

创建代理对象

com.alibaba.dubbo.config.ReferenceConfig#createProxy

通过消费者get()方法可以找到以上方法,消费者需要根据配置的接口生成代理对象。 ###协议生成Invoker ####DubboProtocol

public 
Invoker
refer(Class
serviceType, URL url) throws RpcException { // create rpc invoker. DubboInvoker
invoker = new DubboInvoker
(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把相应的方法及参数值传递,获取对应的返回结果。至此消费者生成代理及调用过程完成了。

转载于:https://my.oschina.net/u/1269959/blog/735506

你可能感兴趣的文章
net core 的Generic Host 之Generic Host Builder
查看>>
SQL Server性能杀手
查看>>
1157: 零起点学算法64——回型矩阵
查看>>
Ubuntu系统清理瘦身
查看>>
How to Analyze Java Thread Dumps
查看>>
SQL-58 获取有奖金的员工相关信息。
查看>>
整数转为罗马数字
查看>>
ubuntu 本地和服务器scp文件传输
查看>>
bitmap
查看>>
image has dependent child images
查看>>
Vim常用的命令
查看>>
redis权限认证及登录
查看>>
判断表是否存在 存储
查看>>
rox + openbox + fbpanel + conky打造又快又稳的桌面
查看>>
“蚁族” 的生活方式画像
查看>>
数据结构概述
查看>>
python自学笔记(二)python基本数据类型之字符串处理
查看>>
springboot1.5升级2.0后遇到的问题
查看>>
Leetcode Word Break II
查看>>
java 8 in action
查看>>