[apache/dubbo]consumer 服务覆盖

2024-06-24 911 views
5

我有两个consumer A和consumer B 注册到nacos时,只发现一个consumer B 的服务,具体是以谁最后注册到nacos为准,请问这是为啥

回答

3

怎么注册的,具体是什么做的细节发一下

5

依赖

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>        
      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo-registry-nacos</artifactId>
            <version>2.6.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-context</artifactId>
            <version>1.1.7.RELEASE</version>
        </dependency>

consumer A 的 xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <dubbo:application name="A"/>

    <dubbo:registry address="${dubbo.address}" group="x" file="./log/dubbo/${info.app.name}.properties">
        <dubbo:parameter key="namespace" value="${dubbo.namespace}"/>
        <dubbo:parameter key="qos.port" value="38821"/>
    </dubbo:registry>

    <dubbo:consumer check="false" timeout="20000"  group ="${dubbo.consumer.group}"/>

    <dubbo:reference interface="com.laundry.service.client.provider.AdminMenuProvider"
                     id="adminMenuProvider" />
</beans>

consumer B 的 xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
    <dubbo:application name="B"/>

    <dubbo:registry address="${dubbo.address}" file="./log/dubbo/${info.app.name}.properties">
        <dubbo:parameter key="namespace" value="${dubbo.namespace}"/>
    </dubbo:registry>

    <dubbo:protocol name="dubbo" dispatcher="${dubbo.app.protocol.dispatcher:message}"/>

    <dubbo:consumer check="false" timeout="20000" group ="${dubbo.consumer.group}"/>

    <dubbo:reference interface="com.laundry.service.client.provider.AdminMenuProvider"
                     id="adminMenuProvider" />
</beans>
7

Dubbo 2.6 已经不在维护很久了,请升级到 Dubbo 3.x 版本。

另外注册 consumer 示例只是为了管控运维使用,真正的服务发现是按 provider 的

1

dubbo 不可能要求用户都要升级到Dubbo 3.x 版本。 另外 正常情况下注册 consumer 实例数正常肯定取决于你成功启动consumer 服务的数量。这种明显的不正常表现难道说是Dubbo 2.6.X的正常现象么?

4

dubbo 不可能要求用户都要升级到Dubbo 3.x 版本。

2.6.x 版本已经是 EOL 状态了,即使确认是有问题也不会再发布版本修复的。

正常情况下注册 consumer 实例数正常肯定取决于你成功启动consumer 服务的数量。

是的

这种明显的不正常表现难道说是Dubbo 2.6.X的正常现象么?

这个需要看下是不是注册中心实现的逻辑问题,这个问题也有可能是 2.6.x 的实现有问题导致。所以升级到 3.x 版本看下是不是符合预期,如果符合预期那就是 2.6.x 实现的逻辑有误,如果升级后还是不符合预期,那就需要看下是不是部署本身有问题。

0

因为我测试环境是k8s部署,线上环境是docker 部署 。测试环境是正常,线上环境是不正常。我其实是确定部署环境点问题导致,但是我想找出是因为什么原因造成这种现象,再考虑有没有其他解决方案。因为升级的成本确实有一定的工作量。 测试环境如下: https://res.senlianshop.com/ad/%E6%B5%8B%E8%AF%95%E7%8E%AF%E5%A2%83.png 线上环境如下: https://res.senlianshop.com/ad/%E7%BA%BF%E4%B8%8A%E7%8E%AF%E5%A2%83.png

0

找一下没有注册的 consumer,开 debug 端口看下 consumer 的注册是不是有提交写入到 nacos

5

com/alibaba/dubbo/registry/integration/RegistryProtocol.java:307 image

9

dubbo-nacos版本不同,doRefer 代码

    private <T> Invoker<T> doRefer(Cluster cluster, Registry registry, Class<T> type, URL url) {
        RegistryDirectory<T> directory = new RegistryDirectory<T>(type, url);
        directory.setRegistry(registry);
        directory.setProtocol(protocol);
        // all attributes of REFER_KEY
        Map<String, String> parameters = new HashMap<String, String>(directory.getUrl().getParameters());
        URL subscribeUrl = new URL(Constants.CONSUMER_PROTOCOL, parameters.remove(Constants.REGISTER_IP_KEY), 0, type.getName(), parameters);
        if (!Constants.ANY_VALUE.equals(url.getServiceInterface())
                && url.getParameter(Constants.REGISTER_KEY, true)) {
            registry.register(subscribeUrl.addParameters(Constants.CATEGORY_KEY, Constants.CONSUMERS_CATEGORY,
                    Constants.CHECK_KEY, String.valueOf(false)));
        }
        directory.subscribe(subscribeUrl.addParameter(Constants.CATEGORY_KEY,
                Constants.PROVIDERS_CATEGORY
                        + "," + Constants.CONFIGURATORS_CATEGORY
                        + "," + Constants.ROUTERS_CATEGORY));

        Invoker invoker = cluster.join(directory);
        ProviderConsumerRegTable.registerConsumer(invoker, url, subscribeUrl, directory);
        return invoker;
    }

测试了没有注册的 consumer 是已经执行了registry.register 了。“没有注册的 consumer” 这个说法可能不对,是已经全部注册了,因为系统访问都是正常的,但是nacos控制台显示实例还是1 。详情里面的元数据属性application=laundry-admin。看出consumers被替换了。 提供者注册: https://res.senlianshop.com/ad/%E6%8F%90%E4%BE%9B%E8%80%85%E6%B3%A8%E5%86%8C.png 消费者1: https://res.senlianshop.com/ad/%E6%B6%88%E8%B4%B9%E8%80%851.png 消费者注册1: https://res.senlianshop.com/ad/%E6%B6%88%E8%B4%B9%E8%80%85%E6%B3%A8%E5%86%8C1.png 消费者2: https://res.senlianshop.com/ad/%E6%B6%88%E8%B4%B9%E8%80%852.png 消费者注册2: https://res.senlianshop.com/ad/%E6%B6%88%E8%B4%B9%E8%80%85%E6%B3%A8%E5%86%8C2.png 消费者注册2详情: https://res.senlianshop.com/ad/%E6%B6%88%E8%B4%B9%E8%80%85%E6%B3%A8%E5%86%8C2%E8%AF%A6%E6%83%85.png

2

两个 consumer 是不是同一个 ip 的,如果是的话分开两台机器部署下。因为在 nacos 中存储的 key 是 ip 没有 port 的,两个相同 key 是会覆盖的

5

是同一个ip,因为我是开发电脑启动会这样,正式环境环境docker 部署因为使用了host网络,consumer也是同一个id。那么是跟这个dubbo-registry-nacos版本有关么?

9

因为consumer本身是没有port属性的,所以只能以 ip 作为唯一标识,本地起多个因为 id 一样,会被认为只有一个

8

我记得以前我用的2.6.7.x好像是可以的,能通过升级版本处理以及最低的可升级版本么,我这边项目比较古老,spring boot的版本是1.5.x的

5

Dubbo 3.x 都是支持 spring boot 1.5.x 的,从 spring 3.x ~ 5.x 都支持