记一次有意思的dubbo服务调用java.lang.NoClassDefFoundError问题排查,尽管如今还不清除具体原理是什么,可是问题已经解决。java
DEBUG
级别也未发现问题。具体异常docker
cause: java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
at net.dubboclub.catmonitor.CatTransaction.createProviderCross(CatTransaction.java:187)
at net.dubboclub.catmonitor.CatTransaction.invoke(CatTransaction.java:55)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)
at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:61)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)
at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:132)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)
at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)
at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:69)
at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:98)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:98)
at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:81)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
复制代码
这个异常抛出在dubbo服务调用方,也就是消费者端,起初觉得是消费者端缺乏commons-lang:2.6.jar
致使,排查发现这个jar包确实是存在的!!!可是为何会报这个异常呢?apache
经过本地idea启动生产者与消费者,采用直连的方式dubbo://localhost:20881
,发现服务居然可以正常提供服务!!!What's up?bash
本地启动可以正常提供服务,那是否是运维新建的环境有问题呢?It's possible.服务器
java -jar project.jar
运行,经过dubbo-admin
观察,发现服务注册成功,测试调用发现服务也是正常!!!javassist
的版本不对致使,经过消费者lib包发现,项目中确实存在两个版本的javassist
,以下图,请运维将低版本的删除,而后启动,发现服务依旧是不行~~~~ 能试的,我都试了,为何你要这么折磨我这个小菜逼,ಥ_ಥ
<dubbo:reference id="${serverId}" interface="${serviceInterfaceClass}" version="${version}" group="${group}" url="dubbo://${ip}:${port}"/>
直连提供者,终于出现了一样的错误~,😂,尽管仍是不知道怎么解决,可是出现了总比不出现要好,对于bug就是这个样子的。。。<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
复制代码
会不会就是这个错误呢?有可能的哦!尽管不是很肯定,但仍是要搞一搞~ 将这个依赖添加上,从新打包部署,好期待奇迹出现哦~ 运行JUnit测试类,What?! 果真奇迹出现了,居然没有错误了!服务呢?是否也正常了?Yes! 服务也正常了!!!网络
致使这个错误的缘由是由于服务提供者没有提供commons-lang:2.6
的依赖包,致使了运行时出错,可是这个异常确抛在了消费端,让人一时懵逼觉得真的是由于消费者出现了错误! 经过异常堆栈发现,使用StringUtils
工具类的是 cat-dubbo-monitor ,项目使用cat监控dubbo服务状态。 至于为何这个错误会出如今消费者端,而不是生产者端,具体缘由还不知道,还请只到的大牛可以给指点一下,很是感谢!!app