java feign调用第三方服务出现序列化错误的排查过程分析

 更新时间:2026年06月12日 09:59:39   作者:天草二十六_简村人  
这篇文章主要介绍了java feign调用第三方服务出现序列化错误的排查过程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、背景

java服务调用另一个java服务的接口,大多是通过服务注册中心,使用java feign client 去调用http接口。

写法如下:

其本质是一个http请求,入参和返回值会自动序列化。

本文分享一个因为序列化失败而报错的排查案例。

二、报错

{“traceId”:null,“code”:10500724010,“msg”:“获取资源详情异常:DataCenterServiceClient#findPersonResourceByUserIdV4(Long,String,Boolean,Boolean,String,Integer,Integer,Boolean,Integer,Integer,Integer,String) failed and no fallback available.”,“description”:null,“errors”:null}

第一反应是对方的服务挂了,所以feign调用出错。

但是,部分用户调用失败,注意是部分。

当我们拿到报错用户的账户进行登录,该错误在本地复现了;也就是说,这个错误是必现的。

所以,我们得出的结论是,脏数据导致查询报错。

但是,问题来了(凡事就怕但是),怎么个脏数据呢?

三、第一次调试过程

因为之前的程序写法,调用别的java服务接口前,并不会打印请求入参,特别是查询类的接口。
一般地,如果是操作类的接口,我们要求程序应该输出请求和返回日志。

所以,因为只有生产环境的数据能够复现,所以我们部署了一套灰度环境。

其次,在调用外部服务的接口前,增加了打印日志,输出请求参数的内容。

示例:

有了请求值,就可以手动调用三方服务的接口。

出乎外料之外的是,手动调用三方服务的接口,返回正常,并不报错。

所以,我们必须打印feign调用的返回值。

于是,我们继续排查。。。

四、打开feign调用的日志

1、FeignConfig

建议所有的spring boot程序框架都实例化该类。

// 配置 Feign 日志级别
@Configuration
public class FeignConfig {
    @Bean
    Logger.Level feignLoggerLevel() {
        // 可选:NONE, BASIC, HEADERS, FULL
        return Logger.Level.FULL;
    }
}

2、配置

# application.yml
# 日志级别设为 DEBUG 或 FULL
logging:
  level:
    # 你的 Feign Client 接口全限定名
    com.xxx.xxx.client.DataCenterServiceClient: debug

如此,便能得到这个类下的所有方法的出入参信息。

原来feign调用报错了,是一个内部错误:

feign.codec.DecodeException

难怪被吞掉了,打印异常的时候,只能看到failed and no fallback available

五、解决问题

通过feign调用日志,我们得知是其中的字段fileLength,长度越界了。
对方是Long类型定义的一个字段,而我们接收方却定义为Integer。

1、三方服务的接口返回值定义

2、接收方的返回值定义

于是乎,出现了数据越界的错误,feign调用的时候,反序列化出错。

六、总结

本文通过打印feignClient调用的出入参信息,得以知晓反序列化出错导致接口调用报错。

也提醒我们,feign调用的日志输出,对于解决线上程序报错的重要性,程序应该默认实例化Logger.Level

其次,因为feign调用的日志输出量非常大,平常是关闭状态,等到要跟踪生产的问题将排得上用场。

最后,定义字段的时候,整型还是长整型,真的是个坑。测试也很难看出来,所以在生产进行测试的时候,不要只以自己的数据为测试结果。

所以,用户上线后,选取部分典型数据进行灰度测试,非常必要。

到此这篇关于java feign调用第三方服务出现序列化错误的排查过程分析的文章就介绍到这了,更多相关java序列化错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java 中基本算法之希尔排序的实例详解

    java 中基本算法之希尔排序的实例详解

    这篇文章主要介绍了java 中基本算法之希尔排序的实例详解的相关资料,这里提供简单实现的实例,帮助大家学习理解此部分知识,需要的朋友可以参考下
    2017-07-07
  • springboot配置logback日志管理过程详解

    springboot配置logback日志管理过程详解

    这篇文章主要介绍了springboot配置logback日志管理过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java协程框架quasar和kotlin中的协程对比分析

    java协程框架quasar和kotlin中的协程对比分析

    这篇文章主要为大家介绍了java协程框架quasar和kotlin两个协程对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多基本
    2022-02-02
  • Spring编程式和声明式事务实例讲解小结

    Spring编程式和声明式事务实例讲解小结

    这篇文章主要介绍了Spring编程式和声明式事务实例讲解小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • SpringBoot实现重试机制的四种方案

    SpringBoot实现重试机制的四种方案

    在分布式系统和微服务架构中,服务调用失败是不可避免的现象,网络不稳定、服务过载、临时故障等因素都可能导致调用失败,重试机制作为一种处理临时性故障的解决方案,能够有效提高系统的可用性,需要的朋友可以参考下
    2025-04-04
  • Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解

    Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解

    这篇文章主要介绍了Java中的ReentrantLock、ReentrantReadWriteLock、StampedLock详解,读写锁:一个资源能够被多个读线程访问,或者被一个写线程访问但是不能同时存在读写线程,需要的朋友可以参考下
    2024-01-01
  • Springboot任务之异步任务的使用详解

    Springboot任务之异步任务的使用详解

    今天学习了一个新技能SpringBoot实现异步任务,所以特地整理了本篇文章,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 树莓派.GPRS.短信接收器

    树莓派.GPRS.短信接收器

    这篇文章主要介绍了树莓派.GPRS.短信接收器的相关知识,需要的朋友可以参考下
    2017-10-10
  • 安装IDEA和配置Maven的步骤详解

    安装IDEA和配置Maven的步骤详解

    这篇文章主要介绍了安装IDEA和配置Maven的步骤详解,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java实现二叉查找树的增删查详解

    Java实现二叉查找树的增删查详解

    二叉查找树(ADT)是一个具有对于树种的某个节点X,它的左节点都比X小,它的右节点都比X大的二叉树。本文将用Java实现二叉查找树的增删查,需要的可以参考一下
    2022-06-06

最新评论