Feign远程调用丢失请求头或异步情况丢失请求上下文

163 阅读1分钟

Feign在远程调用之前要构造请求,会调用很多拦截器来对请求进行增强,如果没有的拦截器,会创建一个新的request请求,这个请求里什么都没有
在这里插入图片描述

解决:添加拦截器解决远程调用丢失请求头

package cn.cloud.xmall.order.config;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * @Description: Feign拦截器
 * @author: Freedom
 * @QQ: 1556507698
 * @date:2022/4/9 13:30
 */
@Configuration
public class XmallFeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
        return template -> {
            //使用RequestContextHolder拿到Controller刚进来的请求数据,ServletRequestAttributes 父类实现了 RequestAttributes
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest(); //老请求
            //同步请求头信息 cookie
            String cookie = request.getHeader("Cookie"); //拿到老请求的cookie
            //给新请求同步老请求cookie
            template.header("Cookie",cookie ); //cookie放到新请求理
        };
    }

    ;

}

解决:异步情况丢失请求上下文

异步情况下开启了多个线程执行任务,所以ThreadLocal会获取不到同一条线程里面的数据

在这里插入图片描述
在自己的线程下再来共享requestAttributes就可以解决

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

        //开启异步任务
        CompletableFuture<Void> getAddress = CompletableFuture.runAsync(() -> {
            //1.远程查询所有的收货地址列表
            RequestContextHolder.setRequestAttributes(requestAttributes);
            List<MemberAddressVo> address = memberFeignService.getAddress(memberRespVo.getId());
            confirmVo.setAddress(address);
        }, executor);