Feign远程调用丢失请求信息原因及解决办法
原因:使用feign向其他服务发起请求,相当于一个新创建一个请求,这个请求中没有包含原来的请求头信息
解决办法:使用拦截器进行拦截,拦截器的执行时间是在发送请求之前,所以可以使用拦截器来添加请求投信息
示意图:
代码示例:
@Configuration
public class FeignConfig{
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor(RequestTemplate template){
//1、RequestContextHolder获取刚进来的请求
RequestAttributes requestAttributes = (RequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//2、获取请求头信息
String cookie = request.getHeader("Cookie");
//3、给新请求同步老请求的cookie
template.header("Cookie",cookie );
}
}
}
Feign异步调用丢失请求上下文原因及解决办法
原因:RequestContextHolder是通过ThreadLocal来获取请求头信息的,一个新的线程会有新的ThreadLocal,所以通过RequestContextHolder来获取请求头信息是获取不到的
解决办法:先获取主线程的ReqeustAttributes,然后把它放到信息成中
示意图
代码示例
.....some codes....
RequestAttributes requestAttrbutes = RequestContextHolder.getRequsetAttributes();
CompletableFuture<Void> future1 = CompletableFuture.runAsync(()->{
...some codes...
RequestAttributes.setAttributes(requestAttributes);
...some codes...
},exectors);