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

       Dubbo消费者流程大概如下主流程包括创建invoker,创建Proxy等。

      创建invoker主要有三种调用方式,inJvm,单机方式,集群方式,其中inJvm主要是为了减少网络开销。单机方式可以减少获取invoker列表,路由,负载均衡等等的逻辑判断,下面是创建invoker,proxy等大体逻辑,当然隐藏了细节,这些细节我们会在下面说:

      我们知道dubbo消费调用的是ReferenceConfig中的get方法,下面是代码

public synchronized T get() {
                 if (destroyed) {
                      throw new IllegalStateException("Already destroyed!");
            }
                 if (ref == null) {
                      init();
                 }
                  return ref;
           }
        我们可以知道init()方法是主体方法,但是其中还有一些前置校验,我们就不一一例举了,我们主要还是看主流程,其中init中的createProxy(Map<String, String> map)是创建proxy的主体方法,而其中创建invoker调用的方法是refprotocol.refer(interfaceClass, urls.get(0));这其中涉及dubbo的扩展点机制,在这里我们只需要知道这里默认的protocal是DubboProtocol的refer方法,也就是我们上面图片中的        Injvm调用     单机模式调用和集群方式 其中集群方式是循环调用refprotocol.refer(interfaceClass, url),获取incoker列表,下面是DubboProtocol中的refer方法

       

optimizeSerialization方法是优化序列化用的,我们先不用关注 invoker的创建使用的构造函数方式,

 DubboInvoker<T> invoker = new DubboInvoker<T>(serviceType, url, getClients(url), invokers);个人觉得在创建   invoker中最核心的一处就在getClients(url)方法这里,getClients传入了一个地址(url),返回了ExchangeClient对象数组,这里有个逻辑就是判断传入的connections,会根据这个connections判断是调用getSharedClient方法还是initClient方法,其实这getSharedClient方法也是调用的initClient,其中的区别就是,getSharedClient方法会先去缓存中取,如果缓存中没有则会加锁获取,这个加锁很有趣,根据key(ip:port)获取对应的锁对象,有兴趣的同学可以看下。所以我们直接看initClient()方法即可,而后创建ExchangeClient的创建有两种方式一种是LazyConnectExchangeClient,另一种是Exchangers.connect,我们看Exchangers.connect即可。发现最终调用的是getExchanger(url)返回的Exchanger的.connect(url, handler)其中

     我们又看到了dubbo的扩展点机制,这个机制我们以后会说,这样我们知道它的默认实现是HeaderExchanger,我们可以看到HeaderExchanger中一层一层的构造函数嵌套 return new HeaderExchangeClient(Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler))), true);

       构造HeaderExchangeClient需要一个Server

 

    而这个server的创建则是通过,Transporters的扩展点进行设置,我们暂时只需要知道这个扩展点的默认实现是NettyTransporter,创建NettyTransporter流程大概如下
    首先调用Transporters.connect(url, new DecodeHandler(new HeaderExchangeHandler(handler)))我们可以看到构建NettyTransports的方法我们需要传递一个DecodeHandler,而创建一个DecodeHandler则需要一个HeadExchangeHandler,到这里创建invoker的流程就结束了,由于都是new 对象的操作,不做任何解释,代码如下:
NettyTransporter
 
 
 
 我们可以看到connect方法上需要一个ChannelHandler,也就是new DecodeHandler,比较有意思的是这个ChannelHandler的构造函数又需要传入一个
ChannelHandler即HeaderExchangeHandler
HeaderExchangeHandler部分代码
 
 
HeaderExchangeHandler构造方法中需要一个ExchangeHandler,而这个实在DubboProtocol中创建的
 
 
创建invoker的流程梳理完毕,接下来我们开始创建Proxy
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值