在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的意思呢,这命名一定是经过深思熟虑的。
包括overrideDirectoryUrl();方法
private void overrideDirectoryUrl() {
// merge override parameters
this.overrideDirectoryUrl = directoryUrl;
List<Configurator> localConfigurators = this.configurators; // local reference
doOverrideUrl(localConfigurators);
List<Configurator> localAppDynamicConfigurators = CONSUMER_CONFIGURATION_LISTENER.getConfigurators(); // local reference
doOverrideUrl(localAppDynamicConfigurators);
if (serviceConfigurationListener != null) {
List<Configurator> localDynamicConfigurators = serviceConfigurationListener.getConfigurators(); // local reference
doOverrideUrl(localDynamicConfigurators);
}
}
getConfigurators(),获取zk中的configurator节点下面的属性进行合并,这里没有看太仔细,不一定对。
而Directory的getUrl又是overrideDirectoryUrl,所以揉合了provider 、consumer的服务治理相关参数。
overrideDirectoryUrl作用:将provider和consumer的parameters进行融合
,且consumer覆盖provider的配置
。