dubbo服务的引用

   dubbo服务的引用的入口在ReferenceBean中,实现ApplicationContextAware接口,在spring容器初始代时,会回调接口的afterPropertiesSet方法, 对配置文件<dubbo:consumer/>标签进行解析初始代。
    ReferenceBean实现了FactoryBean,则对于Factory当调用BeanFactory.getBean()获取对象时,会调用FactoryBean的getObject方法,这是服务引用的入口。

调用顺序入下
1. ReferenceBean.getObject()->ReferenceConfig.get()->ReferenceConfig.init()
2. checkDefault方法获取消费者全局配置,当spring配置文件中没有配置标签时,这里会读取dubbo.properties文件中的配置。
3. 读取dubbo.resolve.file文件,读取文件中指定url直联,优先级高于中指定的 指定映射文件路径,如dubbo.resolve.file=xxx.properties,然后在映射文件xxx.properties中加入: (key为服务名,value为服务提供者url) com.alibaba.xxx.XxxService=dubbo://localhost:20890

  1. 把相关配置读取到map中,并调用createProxy方法。
  2. 把map组装成临时的Url tmpUrl,并根据协议与参数判断是否做本地引用
  3. 加载直联地址与注册中心地址组装urls,数量为一个时,则调用refprotocol.refer方法,否则调用cluster.join,使用集群模式。
  4. 检查是否配置check属性,如果check=true,则需要检测服务的的可用性
  5. 调用proxyFactory.getProxy创建 代理并返回。

RegistryProtocol引用服务过程

  下面讨论单注册中心服务的引用过程, 同样会经过ProtocolListenerWrapper和ProtocolFilterWrapper,对于协议为REGISTRY_PROTOCOL直接跳过,最终由RegistryProtocol处理refer的过程    
   1.根据url获取注册中心, registryFactory.getRegistry->AbstractRegistryFactory.createRegistry()->ZookeeperRegistryFactory.createRegistry()->new ZookeeperRegistry(), 以zookeeper为例,这里会初始代注册服务,获取与zookeeper的连接
    2. 获取group配置,如果配置了多个group, 则使用MergeableCluster分组聚合模式, 
按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。
    3. 接着调用doRefer方法, 创建注册服务目录RegistryDirectory并设置注册中心与协议
    4. 把消费者地址注册到注册中心,并调用directory.subscribe订阅服务。
    5. RegistryDirectory实现了NotifyListener接口,当节点发生变代时,会调用notefy方法,刷新invoker.
    6. notefy方法中,会把提供者的地址传递进来,接着调用 refreshInvoker(invokerUrls),对提供者地址做一些缓存,接着执行toInvokers方法, 对于新的地址,执行如下
     boolean enabled = true;
                    if (url.hasParameter(Constants.DISABLED_KEY)) {
                        enabled = ! url.getParameter(Constants.DISABLED_KEY, false);
                    } else {
                        enabled = url.getParameter(Constants.ENABLED_KEY, true);
                    }
                    if (enabled) {
                        invoker = new InvokerDelegete<T>(protocol.refer(serviceType, url), url, providerUrl);
                    }
         这里的enbaled值对应着dubbo-admin中是否禁用了提供者,正常情况下,会初始代一个InvokerDelegete,如果协议为dubbo,则会调用DubboProtocol.refer方法返回invoker,并缓存到RegistryDirectory中.
   7. RegistryProtocol中调用 cluster.join方法,默认使用FailoverCluster,实例代Invoker返回。

DubboProtocol引用服务过程

    上一部分中,RegistryDirectory最终仍会使用DubboProtocol.refer()方法创建invoker,而用户拿的的invoker(即cluster.join方法返回的)则是通过这里返回的invoker包装而来。下面来分析一DubboProtocol引用服务过程。
     1. DubboProtocol.refer()方法根据接口类型与提供者地址实例代DubboInvoker
     2. getClients方法获取客户端连接,initClient方法创建新连接。
     3. Exchangers.connect-> getExchanger(url).connect(url, handler), 初始代HeaderExchanger,并建立连接,HeaderExchangeClient中会起动一个Timer发送心调包
     4. 建立接按后,把初始代的invoker放入缓存并返回。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值