【SpringCloud系列】OpenFeign调用鉴权及解决由于多线程调用OpenFeign导致的request请求数据丢失的问题

本文介绍如何使用自定义拦截器为OpenFeign请求添加请求头以实现认证,同时解决多线程环境下请求头丢失的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

SpringCloud微服务之间调用一般使用OpenFeign,认证鉴权一般是通过添加特定的请求头。那么OpenFeign请求其他微服务的时候也要携带特定的请求头,这时候就需要一个拦截器,统一添加请求头。

一、请求拦截

最简单的方案就是实现feign.RequestInterceptor接口。这样使用OpenFeign请求其他微服务接口的时候就会携带请求头,保证认证通过。

@Slf4j
@Configuration
public class CustomFeignRequestInterceptor implements RequestInterceptor {


    @Override
    public void apply(RequestTemplate template) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

        if (attributes != null) {
            HttpServletRequest request = attributes.getRequest();
            // 转发token
            template.header("token", request.getHeader("token"));
        }
    }
}

二、多线程调用导致问题

有时候需要多线程调用FeignClient来获取数据,但是会导致无法携带token的异常。经过断点发现,使用多线程调用FeignClient时,在拦截器中无法获取ServletRequestAttributes。因此怀疑是多线程导致Request数据丢失,具体原因未深究。解决办法就是从主线程拿到ServletRequestAttributes,然后在异步线程里再放进Request中。

示例代码如下

//从主线程获取所有request数据
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

executor.execute(() -> {
    //其他线程放入request数据
    RequestContextHolder.setRequestAttributes(requestAttributes);
           
});

写在最后的话

多线程调用FeignClient其实很少用到,但是有些场景下为了减少耗时不得不用。当初遇到这个问题,花了好长时间才解决,毕竟万事开头难。希望这篇文档能给你带来一点启发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值