记一次线上线上同类名不同jar包导致的问题排查

509 阅读1分钟

问题描述:

当晚服务上线之后,上游小伙伴反应服务调用不通。

前置信息

  1. 该服务是web服务,打成war包在tomcat8上运行

  2. 该服务对下游通过dubbo进行调用

分析过程:

  1. 能不能先回滚,所有对下游服务的调用都不可用了。答案是不能,当晚上线需求涉及到多个服务,无法对单个服务进行回滚

  2. 是因为上线导致的问题说明当前上线代码有问题,测试环境验证通过说明这次的业务代码没有问题

排查过程

  1. 查看服务ELK日志

image.png

根据报错内容是 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存在两个依赖

image.png 考虑可能是不同的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 验证我们猜想

image.png 在redisson 包里面引入 netty-common

继续看源码往下分析原因 elk日志报错行 at io.netty.buffer.PooledByteBuf.recycle(PooledByteBuf.java:179)代码定位到这里

image.png 说明 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>

拓展