Dubbo overrideDirectoryUrl的作用?

本文探讨了Dubbo中overrideDirectoryUrl的作用,指出其在MockClusterIncoker的invoke方法中涉及,主要负责合并provider和consumer的参数。在RegistryDirectory初始化时,overrideDirectoryUrl通过zookeeper URL设置,并在刷新invoker时进行参数合并。通过对overrideDirectoryUrl的分析,揭示了Dubbo如何处理客户端和服务端的配置同步。

文章目录


拾遗

在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的配置

Spring Cloud 和Dubbo 都是企业级服务发现和微服务架构的解决方案,它们各有特点: **Spring Cloud**: 1. **背景不同**:Spring Cloud 是基于Spring框架的一系列组件集合,构建在成熟稳定的Spring生态系统之上。 2. **轻量级**:Spring Cloud 侧重于提供微服务的全栈解决方案,包括服务网关(Zuul)、服务注册与发现(Eureka)、负载均衡(Hystrix)、断路器(Resilience4j)、消息总线(RabbitMQ 或 Kafka 等)等。 3. **声明式API**:通过@EnableXxx注解轻松启用功能,简化了服务集成的配置。 4. **开箱即用**:Spring Cloud 提供了一套完整的工具链,可以快速搭建微服务架构。 **Dubbo**: 1. **初心不同**:Dubbo 主要是阿里巴巴内部早期的分布式服务治理框架,旨在解决高性能、高可用的远程服务调用问题。 2. **设计目标**:强调性能、稳定性、高并发,适合大规模商业系统。 3. **协议丰富**:除了HTTP和RPC外,还支持其他如TCP、UDP、JMS等通信协议。 4. **侵入性较强**:Dubbo 使用的是注解驱动的编程模式,需要在每个服务接口上显式配置。 **区别总结**: - Spring Cloud 更注重微服务的全面解决方案和开发体验,而Dubbo 更偏向底层服务治理。 - Spring Cloud 可能更适合对快速迭代和开发效率要求较高的团队。 - Dubbo 则适用于对性能、稳定性和容错有极高要求的大型企业应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值