编码踩坑——dubbo异常“Service not found“

今天接到一个开发任务,需要在工程A的原dubbo接口上新增一个方法来支持业务需求,于是分分钟CTRL+C/V完成了开发任务,准备自测;自测方法是首先本地打新的二方SNAPSHOT包,然后启动应用,准备在PAAS平台的服务治理中调用下新接口,看下是否正常;

可是,问题来了!!!

现象1:

在服务治理里面找不到新增的方法;根据之前的经验,通过IDEA的Maven插件,对工程进行clean,然后重新启动;结果——还是找不到新增的方法,只有以前的改接口下的方法;

感觉是打包有问题,于是重新打了SNAPSHOT的包,重启应用,服务治理还是没有新增的方法;

思考了下,可能是ZK中的dubbo接口的方法列表信息并没有被更新,但实际上新方法所在的服务是启动了,于是启动另一个应用B,在B中引用应用A的新SNAPSHOT包,并在代码中通过dubug模式的Evaluate Expression(ALT+F8计算表达式)调用dubbo接口的新增的方法;神奇的现象发生了!

现象2:

新增的方法可以调用成功,并且结果正确的返回;但此时,控制台打印了一串异常,如下:

核心的异常信息是:

“ Caused by: java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.RemotingException: Fail to decode request due to: java.lang.IllegalArgumentException: Service not found:xxx ”

网上搜了下原因,没有找到解决方案;但是根据之前的经验,IDEA本身存在一些问题,如父pom中的<dependency>中的<artifactId>或<version>标红,提示依赖未找到;

原因是IDEA并没有去主动去拉对应的<dependency>,本地仓库也没有;

这种依赖问题的解决方案是:

将这一段<dependency>复制到子模块module的pom中,如XX-service的pom,等待稍许,就会惊喜的发现二方包依赖拉下来了,<dependency>不再标红;

因此,推测可能是尽管本次新增dubbo接口的方法的服务已经打包并启动,但是IDEA没有把最新的二方包拉入,启动时还是用的上次的没有新方法的包;于是——

最终的解决方案:

去本地的.m2文件的repository中,手动删除当前包的所有version文件夹,然后重新在IDEA的父pom右键重新导包,然后重启服务,发现新方法可以正常被服务治理发现了,并且可以正常调用,dubbo异常“Service not found“不再出现,问题解决!
经验分享 程序员 微信小程序 职场和发展