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 见下一节