问题描述:
当晚服务上线之后,上游小伙伴反应服务调用不通。
前置信息
-
该服务是web服务,打成war包在tomcat8上运行
-
该服务对下游通过dubbo进行调用
分析过程:
-
能不能先回滚,所有对下游服务的调用都不可用了。答案是不能,当晚上线需求涉及到多个服务,无法对单个服务进行回滚
-
是因为上线导致的问题说明当前上线代码有问题,测试环境验证通过说明这次的业务代码没有问题
排查过程
- 查看服务ELK日志
根据报错内容是 io.netty.util.Recycler$DefaultHandle does not implement the requested interface io.netty.util.internal.ObjectPool$Handle 说明实际加载的类没有实现 io.netty.util.internal.ObjectPool$Handle 接口。
IDEA 查看o.netty.util.Recycler$DefaultHandle存在两个依赖
考虑可能是不同的jar包引入了相同限定名类名的类,对比两个类 netty-common包的确实没有实现ObjectPool.Handle,结合当天发版对 pom文件有修改如下:
<dependency>
<groupId>com.haier</groupId>
<artifactId>paycenter-service</artifactId>
<version>1.9.83</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</exclusion>
</exclusions>
</dependency>
所以只能是 paycenter-service引入了netty-common依赖导致类加载器加载了 netty-common中的 io.netty.util.Recycler$DefaultHandle类而不是 netty-all中的
借助IDEA 插件 MAVEN HELPER 验证我们猜想
在redisson 包里面引入 netty-common
继续看源码往下分析原因 elk日志报错行 at io.netty.buffer.PooledByteBuf.recycle(PooledByteBuf.java:179)代码定位到这里
说明 recyclerHandle 这个对象对应的类并没有实现
io.netty.util.internal.ObjectPool$Handle
解决办法
<dependency>
<groupId>com.haier</groupId>
<artifactId>paycenter-service</artifactId>
<version>1.8.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
</dependency>