1、问题描述
前段时间碰到一个问题,有两个服务A和服务B,通过feign进行通信。因为feign之间无法直接传递请求头,只能传请求体。因此需要借助RequestInterceptor拦截器获取到请求头。服务B中设置了RequestInterceptor拦截器,但是在A进行feign调用B的时候有时候能触发B的RequestInterceptor拦截器,有时候又没有触发B的RequestInterceptor拦截器。
2、产生原因
之所以有时能走到RequestInterceptor这里,有时走不到。这是由于我在启动类上的EnableFeignClients注解扫描的是包 @EnableFeignClients({"com.my.feign"})。 只要换成扫描具体的class就不会有这个问题了@EnableFeignClients(clients = {ProducerApiFeign.class})。
分析产生的原因我在FeignClientsRegistrar类里面打了断点,启动的时候看了执行步骤:
1、启动类使用@EnableFeignClients({"com.my.feign"})
2、启动类使用@EnableFeignClients(clients = {ProducerApiFeign.class})
3、解决方法
把@EnableFeignClients({"com.my.feign"})
换成
@EnableFeignClients(clients = {ProducerApiFeign.class})就行了。
4、参考代码
为了复现这个问题,我简单写了一个生产者和消费者。
代码:【免费】feign之间相互通信RequestInterceptor拦截器失效相关代码资源-CSDN文库
项目结构说明:
MyEureka:
使用@EnableEurekaServer使其作为eureka服务端。
MyProducer:
生产者服务
MyCustomer:
消费者服务
5、总结
无
6、参考资料
@FeignClient配置 configuration 不生效_feignclient configuration不生效-CSDN博客