最近帮忙同事解决了一个很奇怪的问题,首先我们启动一个某个服务的生产者服务,service版本号是1.0,然后我们启动了一个消费者来调用这个生产者reference版本号也设置为1.0,但是在启动消费者程序之后发现怎么也消费不到生产者服务,报错为:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method xxx in the service com.xxx.xxx. No provider available for the service xxx.xxx:1.0 from registry 1.2.3.4:21810on the consumer
但是通过zookeper的目录发现生产者的确是存在的,百思不得其解,然后我们尝试把生产者和消费者版本号都修改为2.0,结果这样子就能消费成功了…
然后对这个诡异的问题开始查找原因,最后终于在zookeper上发现眉目,发现如下目录
/dubbo/com.xxx.xxx/configurators/override://1.2.3.4:20000/com.xxx.xxx?category=configurators&disabled=true&dynamic=false&enabled=true&version=1.0
这是关于生产者服务提供方动态配置规则的目录,一般是在dubbo-admin配置服务规则之后会生成这个目录,然后之前监听过zookerper的节点会接到回调,然后更新对应的路由规则
从上面的内容可以看到disabled=ture,所以这里设置的路由规则就是1.2.3.4:20000这个服务的1.0版本是被禁用掉的,所以对于消费者来说1.0版本是无效版本,这也就是为什么版本改成2.0之后,可以调用成功,所以我们修复这个问题的方式就是把这个目录删掉即可。
下面我们来跟踪一下源码,看一下dubbo里面消费者选择生产者的路由过程
我们从代理对象执行invoke方法开始(消费者的代理过程这里不详述)