我有两个consumer A和consumer B 注册到nacos时,只发现一个consumer B 的服务,具体是以谁最后注册到nacos为准,请问这是为啥
[apache/dubbo]consumer 服务覆盖
回答
怎么注册的,具体是什么做的细节发一下
依赖
<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>
Dubbo 2.6 已经不在维护很久了,请升级到 Dubbo 3.x 版本。
另外注册 consumer 示例只是为了管控运维使用,真正的服务发现是按 provider 的
dubbo 不可能要求用户都要升级到Dubbo 3.x 版本。 另外 正常情况下注册 consumer 实例数正常肯定取决于你成功启动consumer 服务的数量。这种明显的不正常表现难道说是Dubbo 2.6.X的正常现象么?
dubbo 不可能要求用户都要升级到Dubbo 3.x 版本。
2.6.x 版本已经是 EOL 状态了,即使确认是有问题也不会再发布版本修复的。
正常情况下注册 consumer 实例数正常肯定取决于你成功启动consumer 服务的数量。
是的
这种明显的不正常表现难道说是Dubbo 2.6.X的正常现象么?
这个需要看下是不是注册中心实现的逻辑问题,这个问题也有可能是 2.6.x 的实现有问题导致。所以升级到 3.x 版本看下是不是符合预期,如果符合预期那就是 2.6.x 实现的逻辑有误,如果升级后还是不符合预期,那就需要看下是不是部署本身有问题。
因为我测试环境是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
找一下没有注册的 consumer,开 debug 端口看下 consumer 的注册是不是有提交写入到 nacos
com/alibaba/dubbo/registry/integration/RegistryProtocol.java:307
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
两个 consumer 是不是同一个 ip 的,如果是的话分开两台机器部署下。因为在 nacos 中存储的 key 是 ip 没有 port 的,两个相同 key 是会覆盖的
是同一个ip,因为我是开发电脑启动会这样,正式环境环境docker 部署因为使用了host网络,consumer也是同一个id。那么是跟这个dubbo-registry-nacos版本有关么?
因为consumer本身是没有port属性的,所以只能以 ip 作为唯一标识,本地起多个因为 id 一样,会被认为只有一个
我记得以前我用的2.6.7.x好像是可以的,能通过升级版本处理以及最低的可升级版本么,我这边项目比较古老,spring boot的版本是1.5.x的
Dubbo 3.x 都是支持 spring boot 1.5.x 的,从 spring 3.x ~ 5.x 都支持