这是工作中遇到的问题,不方便截代码,就只贴下描述和解决方案

问题描述

    MQ消费者调用Feign,得到的结果无法正常解析


问题原因

场景1(正常)

  • 调用链路
    Postman → A服务接口 → Feign调用B服务 → 触发A服务的
    RequestInterceptor(代码在common-service) → 添加请求头Data-Uniform-Format-Flag: N → B服务@ControllerAdvice检测到该头,不对结果封装

场景2(异常)

  • 调用链路
    MQ消息 → A服务消费者 → Feign调用B服务 →
    RequestInterceptor未触发(代码在common-service) → 请求头Data-Uniform-Format-Flag缺失 → B服务@ControllerAdvice默认对结果封装 → 导致下游解析异常。

 

 

影响范围

  • 所有通过MQ触发的Feign调用均返回错误封装格式,影响业务逻辑

服务中现有的Feign案例

1、返回结果使用和Feign服务端一样的类型接收

2、使用IResult接口的实现类接收结果(包装类)

解决方案

通过配置全局启用拦截器,确保MQ调用的Feign客户端触发逻辑

步骤一:全局启用拦截器

    方式1:

    在需要配置全局启用拦截器的服务启动器上,@EnableFeignClients中增加defaultConfiguration = FeignConfiguration.class


    方式2:

    在FeignConfiguration的@EnableFeignClients中,basePackages增加扫描范围,范围填Feign客户端的对应包名


步骤二:请求头增加属性值

    在如下位置增加Data-Uniform-Format-Flag请求头,值为N


总结:

MQ消费者使用Feign调用其它服务,是没有请求上下文消息的。Feign的拦截器无法获取相关信息,需要手动模拟或者主动设置