dubbo源码分析10-- ReferenceConfig初始化过程

1.它实现了FactoryBean.get(),得到的就是代理对象
2.初始化配置
3.拼装url
4.invoker = refprotocol.refer(interfaceClass, urls.get(0));

  • 根据注册协议获取到ZookeeperRegistry
  • 组装consume的url
  • 向zookeeper中注册节消费者节点/dubbo/com.test.ITestService/consumers/consumer://
  • 订阅提供者节点/dubbo/com.test.ITestService/providers
    //TODO

  • 根据容错机制返回对应的Invoker
    //TODO

5.proxyFactory.getProxy(invoker)

//ReferenceConfig是个FactoryBean,那么他获取到的对象就是调用get方法
public synchronized T get() {
     if (destroyed){
          throw new IllegalStateException("Already destroyed!");
      }
    if (ref == null) {
        init();
    }
    return ref;
}
private void init() {
   if (initialized)
         return;
   initialized = true;
   // 组装url以及检查一些属性
   Map<String, String> map = new HashMap<String, String>();

   //attributes通过系统context进行存储.
   StaticContext.getSystemContext().putAll(attributes);
   ref = createProxy(map);
}

//创建代理
private T createProxy(Map<String, String> map) {
   URL tmpUrl = new URL("temp", "localhost", 0, map);
   //....
   // 用户指定URL,指定的URL可能是对点对直连地址,也可能是注册中心URL
   if (url != null && url.length() > 0) {
       String[] us = Constants.SEMICOLON_SPLIT_PATTERN.split(url);
       //将url保存到urls中
    } else { 
       // 通过注册中心配置拼装URL
       List<URL> us = loadRegistries(false);
       //将url保存到urls中
    }
     //如果只有一个注册中心
     if (urls.size() == 1) {
         invoker = refprotocol.refer(interfaceClass, urls.get(0));
     } else {
         List<Invoker<?>> invokers = new ArrayList<Invoker<?>>();
         URL registryURL = null;
         for (URL url : urls) {
             invokers.add(refprotocol.refer(interfaceClass, url));
             if (Constants.REGISTRY_PROTOCOL.equals(url.getProtocol())) {
                 registryURL = url; // 用了最后一个registry url
             }
         }
         //根据cluster来执行
         if (registryURL != null) { // 有 注册中心协议的URL
             // 对有注册中心的Cluster 只用 AvailableCluster
             URL u = registryURL.addParameter(Constants.CLUSTER_KEY, 
             AvailableCluster.NAME); 
             invoker = cluster.join(new StaticDirectory(u, invokers));
         }  else { // 不是 注册中心的URL
             invoker = cluster.join(new StaticDirectory(invokers));
         }
     }
 }


 // 创建服务代理
 return (T) proxyFactory.getProxy(invoker);
}

创建invoker 见下一节

猜你喜欢

转载自blog.csdn.net/liyue1090041509/article/details/80197414