Dubbo学习笔记第五章:Dubbo服务引入源码解析

当Spring启动过程中,会去给@Reference注解标注了的属性去进行赋值,赋值的对象为ReferenceBean中get()方法所返回的对象,这个对象是一个代理对象。

 

对于ReferenceBean,它表示应用想要引入的服务的信息,在执行get()时会做如下几步:

  1. 调用checkAndUpdateSubConfigs(),检查和更新参数,和服务提供者类似,把ReferenceBean里的属性的值更新为优先级最高的参数值
  2. 调用init()去生成代理对象ref,get()方法会返回这个ref
  3. 在生成代理对象ref之前,先把消费者所引入服务设置的参数添加到一个map中,等会根据这个map中的参数去从注册中心查找服务
  4. 把消费者配置的所有注册中心获取出来
    1. 如果只有一个注册中心,那么直接调用Protocol的refer(interfaceClass, urls.get(0));得到一个Invoker对象
    2. 如果有多个注册中心,则遍历每个注册中心,分别调用Protocol的refer(interfaceClass, url);得到一个Invoker对象添加到invokers中,然后把invokers调用CLUSTER.join(new StaticDirectory(u, invokers));封装所有invokers得到一个invoker,
  1. 把最终得到的invoker对象调用PROXY_FACTORY.getProxy(invoker);得到一个代理对象,并返回,这个代理对象就是ref
  2. 总结:上文的Invoker对象,表示服务执行者,从注册中心refer下来的是一个服务执行者,合并invokers后得到的invoker也是一个服务执行者(抽象范围更大了)

 

接下来,来看Protorol.refer(interfaceClass, url)方法是怎么生成一个Invoker的

  1. 首先interfaceClass表示要引入的服务接口,url是注册中心的url(registry://),该url中有一个refer参数,参数值为当前所要引入服务的参数
  2. 调用doRefer(cluster, registry, type, url)
  3. 在doRefer方法中会生成一个RegistryDirectory
  4. 然后获取新版本中的路由器链,并添加到RegistryDirectory中去
  5. RegistryDirectory监听几个目录(注意,完成监听器的订阅绑定后,会自动触发一次去获取这些目录上的当前数据
    1. 当前所引入的服务的动态配置目录:/dubbo/config/dubbo/org.apache.dubbo.demo.DemoService:1.1.1:g1.configurators
    2. 当前所引入的服务的提供者目录:/dubbo/org.apache.dubbo.demo.DemoService/providers
    3. 当前所引入的服务的老版本动态配置目录:/dubbo/org.apache.dubbo.demo.DemoService/configurators
    4. 当前所引入的服务的老版本路由器目录:/dubbo/org.apache.dubbo.demo.DemoService/routers
  1. 调用cluster.join(directory)得到一个invoker
  2. 返回invoker(如果消费者引入了多个group中的服务,那么这里返回的是new MergeableClusterInvoker<T>(directory);,否则返回的是new FailoverClusterInvoker<T>(directory);)
  3. 但是,上面返回的两个Invoker都会被MockClusterInvoker包装,所以最终返回的是MockClusterInvoker。

 

新版本构造路由链

RouterChain.buildChain(url)方法赋值得到路由链。

这里的url是这样的:consumer://192.168.0.100/org.apache.dubbo.demo.DemoService?application=dubbo-demo-consumer-application&dubbo=2.0.2&group=g1&interface=org.apache.dubbo.demo.DemoService&lazy=false&methods=sayHello&pid=19852&release=2.7.0&revision=1.1.1&side=consumer&sticky=false&timestamp=1591332529643&version=1.1.1

 

表示所引入的服务的参数,在获得路由链时就要根据这些参数去匹配得到符合当前的服务的Router.

 

  1. RouterChain.buildChain(url)
  2. new RouterChain<>(url)
  3. List<RouterFactory> extensionFactories = ExtensionLoader.getExtensionLoader(RouterFactory.class).getActivateExtension(url, (String[]) null);根据url去获取可用的RouterFactory,可以拿到四个:
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

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

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

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值