写点什么

Dubbo overrideDirectoryUrl 的作用?

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1014 字

    阅读完需:约 3 分钟




[](


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


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 的意思呢,这命名一定是经过深思熟虑的。

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Dubbo overrideDirectoryUrl的作用?