404008945
404008945
实测在最新2.7.16版本下仍有这个问题 > 升级到 2.7 最新版本试下
> @404008945 provider 和 consumer 都升级,2.7 的早期有个版本注册是有问题的 @AlbumenJ 问题找到了。 生产和消费者都是升级了最新版的2.7.16,另外nacos-client为1.3.3时有问题,**测试nacos-client版本为2.0.4已经没有问题了** **问题记录** 生产者注册服务名称逻辑为 org.apache.dubbo.common.URL#getColonSeparatedKey ```java public String getColonSeparatedKey() { StringBuilder serviceNameBuilder = new StringBuilder(); serviceNameBuilder.append(this.getServiceInterface()); append(serviceNameBuilder, VERSION_KEY, false); append(serviceNameBuilder, GROUP_KEY, false);...
> @huwenming-saw > > > 还是会订阅一个空服务,这个空服务对应的接口还是同一个URL,这个时候难道就不会出现No provider available? > > 这个取决于 nacos 是否会主动推空,这块取决于 nacos 的缓存与版本。2.7.17 及以后的版本在 Dubbo 侧做了过滤,防止空覆盖。 > > > 换另一个角度来说最好的解决方法还是需要提供group version值是最完美的解决方法是吗? > > Dubbo 默认就是支持空 group、version 的,只是在实践中指定了 group、version...
> org.apache.dubbo.registry.nacos.NacosAggregateListener 内部会聚合 NacosAggregateListener 内部会聚合这个我明白,我的意思是两种url共用了同一个nacosListener(因为computeIfAbsent),都会触发同一个nacosListener,而这个nacosListener中的serviceName又是固定的(先进入方法的那个serviceName)。 现在假设 同一服务的两种serviceName,A1(有实例)和A2(空实例) 1. A1首先进入subscribeEventListener方法,那么会注册添加一个nacos监听器EventListener,使用匿名内部类的形式创建,内部类中的serviceName就是A1,然后使用这个nacosListener监听A1 2. A2之后再进入subscribeEventListener ,A2会和A1共用同一个nacosListener,那么这个nacosListener的serviceName仍然是A1 同样使用这个nacosListener监听A2 那么当 nacos通知A2无实例时,调用nacosListener,监听器中调用notifySubscriber(url, serviceName, listener, instances); 但是这个serviceNames是A1,**变成了通知A1无实例** 
> @404008945 想问一下,这个问题如果做到必现的话,是不是取决于`Set serviceNames = getServiceNames(url, nacosAggregateListener);`的迭代顺序? @huwenming-saw 是的,首先进入这个方法的serviceName是非空实例,第二个进入的是空实例,那么就必现,并且nacos-cli的版本用1.3.1或者1.3.3。另外我试了1.4.x,nacos不会在订阅的时候主动触发服务变动,这种情况就不会有问题了