Dubbo消费者-Proxy创建(基于2.6.5)

dubbo的远程调用采用动态代理的方式非常意思,使用动态代理可以让接口像在本地调用方法一样,调用远程方法,
而这个动态代理正是基于invoker的,也就是我们上一章讲到的invoker创建,相信大家对动态代理已经有一定的了解了。
而dubbo创建service proxy只有这么一句代码 


而proxy是由proxyFactory创建的,proxyFactory创建proxy的过程如下 private static final ProxyFactory
 proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();而 
这个默认的ProxyFactory是JavassistProxyFactory代码如下:



我们可以看到getProxy方法调用的Proxy.getProxy方法,代码如下这里使用了javassits创建的一个Proxy类,名字叫做Proxy+id,而这个Proxy类实现了业务接口,从而达到调用业务接口的方法。而这个类还有一个方法叫做newInstance,这个newInstance正是前面提到的return (T) Proxy.getProxy(interfaces).newInstance(new InvokerInvocationHandler(invoker));具体实现类,而这个逻辑很简单,就是new { return new " + pcn + "($1); }");大家很可能有点懵这个pcn是干嘛的。这个类也是有Proxy创建的,它内部有一个InvocationHandler属性,而这个new InvokerInvocationHandler(invoker)包装了invoker的InvocationHandler就是作为pcn的构造函数,最终创建了一个Proxy,实际上这个Proxy作为一个伪装的接口实现类,当调用 Proxy的时候,调用的是new InvokerInvocationHandler(invoker)中的invoker方法,代码如下
我当时看到这里也是有点懵,这个invoker又是什么,原来就是我们上篇讲过的,处理具体的业务,代理始终是代理,
真正做业务的逻辑还是这个invoker,也就是说InvokerInvocationHandler只是作为一个中间层,那么这个invoker
到底是那个invoker,dubbo中有9中invoker,默认的是    FailoverClusterInvoker
到这里又有点懵了不是调用的invoker方法吗,别着急看它的父类,AbstractClusterInvoker,是不是有个invoker方法,
而这个invoker方法调用了这个doinvoker方法,这个doInvoker方法是个抽象方法,我们来看下

果然如此,这样一来通过FailoverClusterInvoker的doInvoker方法,就可以通过动态代理中的做到像调用本地方法一样调用远程方法,这个doInvoker会根据传入的invoker,查找对应的提供者列表,再通过路由器,在经过负载均衡,最终选出一个具体的服务器地址,最终消费者就会根据这个invoker调用具体的服务,并把调用结果返回

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值