Dubbo overrideDirectoryUrl 的作用?
[](
https://blog.csdn.net/dataiyangu/article/details/105870199)拾遗
================================================================
在 MockClusterIncoker 的 invoke 方法中
//从 Directory 中拿到目标地址,从而拿到 mock 值
String value = directory.getUrl().getMethodParameter(mock);
那 mock 不是在 reference 中配置中生效的吗?貌似所有的都是客户端优先级高于服务端把,如果我没有记错的话?所以这个目标地址的意思是 overrideDirectoryUrl,关键 overrideDirectoryUrl 到底存的是什么?
哪个这个 directory.getUrl 是谁?是 registryDirectory 的 overrideDirectoryUrl,可是这个是目标地址?
首先 overrideDirectoryUrl 是在 RegistryDirectory 初始化的时候构造函数传进来的所以一定是 zookeeper://xxxxxx(在 registryProtocol 的 dorefer 中初始化的,参数是 url,这个 url 是 refer 方法中将 registry://xxxx 转化为了 zookeeper://xxx)。
在 RefrenceConfig 的 getProxy 方法中,对 urls 打断点
内容提取出来
嗯,之前在封装 urls 的时候已经将方法的 mock 封装进去了。
还没完,在追踪的过程中发现了一个关于 overrideDirectoryUrl 的小细节,之前说到客户端会同步服务端的相关配置在哪里呢?
我猜就是在 overrideDirectoryUrl 中
在 refreshInvoker 中的 toInvoker 方法中:
URL url = mergeUrl(providerUrl);
进入 mergeUrl
// Merge the provider side parameters
this.overrideDirectoryUrl = this.overrideDirectoryUrl.addParametersIfAbsent(providerUrl.getParameters());
可以看到将 providerurl 中的 parameter 合并到了 overrideDirectoryUrl,还没完,进入 addParametersIfAbsent,根据字面意思都能知道如果存在的话不覆盖,那么进入看一下究竟把?
public URL addParametersIfAbsent(Map<String, String> parameters) {
if (CollectionUtils.isEmptyMap(parameters)) {
return this;
}
//map 是 provideruri 的
Map<String, String> map = new HashMap<>(parameters);
//putAll 会覆盖,即 consumer 覆盖 provider
map.putAll(getParameters());
//返回最终的 map
return new URL(protocol, username, password, host, port, path, map);
}
看来是这样的,所以到这里知道为什么consumer配置的优先级高于provider
了,因为直接将本地的 map 覆盖了远端的 map(putAll),还真有点 merge 的意思呢,这命名一定是经过深思熟虑的。
评论