Dubbo Consumer 对Provider的protocol选择逻辑

一、简介
dubbo consumer 如果没有指定protocol参数,默认会将provider注册的protocol provider url都获取并转换为Invoker放到Directory中。如果consumer指定了protocol则会在Directory中选择相应的protocol provider url转换为Invoker放在Directory中。

二、代码分析
逻辑的主要代码下面4处
1、ReferenceConfig.createProxy()
该方法是服务发现的入口方法,该方法的主要逻辑是创建Invoker对象,并生成Proxy对象。其中有调用的parseUrl(Map<String, String>)方法会将referenceParameters放到url中一个名为"refer"的属性中,代码如下:
在这里插入图片描述
1、RegistryProtocol.refer()
该方法会将“refer”属性提出来,然后进入doRefer()方法中获取"protocol"参数值,将protocol参数值做为consumerUrl的protocol,同是将referenceParamters做为consumerUrl的参数,consumerUrl的protocol参数会在后面的服务发现中做为一个条件用于筛选相应protocol的provider url。
在这里插入图片描述
2、AbsractDirectory构造函数
在AbstractDirectory的构造函数中也有类似的处理,先从url中取出referenceParamters属性,再将其添加到consumerUrl的参数中, 这样protocol参数也就设置到了consumerUrl的参数中了。
在这里插入图片描述

3、RegistryDirectory.toInvokers()
该方法就是筛选对应protocol provider url的逻辑之外:
在这里插入图片描述
如果provider url的protocol与consumer指定的protocol不一致,则不会被转换为Invoker对象。checkProtocolValid()代码逻辑如下:

  • 如果consumer queryProtocols不为空,则判断consumer queryProtocols是否包含providerUrl.protocol
  • 如果consumer queryProtocols为空,则判断consumer dubbo是否支持providerUrl.protocol
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值