Dubbo消费者

Stella981
• 阅读 468

创建代理对象

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获取客户端信息。 Dubbo消费者

以上红框中是rpc层与remote层的转换。requestHandler是一个抽象类。

####Invoker生成代理对象 dubbo使用代理工厂来生成代理对象,dubbo默认使用的JavassistProxyFactory来生成代理对象。

com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory

Dubbo消费者 Dubbo消费者 上图为代理工厂生成的代理对象的方法,此方法生成代理比较隐晦,因为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把相应的方法及参数值传递,获取对应的返回结果。至此消费者生成代理及调用过程完成了。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Dubbo服务者
创建代理对象com.alibaba.dubbo.config.ServiceConfigexport通过消费者export()方法可以找到以上方法,消费者需要根据配置的接口生成代理对象。生成Invoker!输入图片说明(https://static.oschina.net/uploads/img/201
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这