这是工作中遇到的问题,不方便截代码,就只贴下描述和解决方案
问题描述
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的拦截器无法获取相关信息,需要手动模拟或者主动设置
评论区