存在问题:Feign远程调用丢失请求头问题 feign在远程调用之前要构造请求,调用了很多的拦截器 1.浏览器发送请求,请求头自动带来了cookie 到order服务 2.order服务通过feign远程调用 cart服务 feign会创建一个新的request【这个请求没有带任何请求头】 没有带请求头,cart服务就认为没登录 解决:加上feign远程调用的请求拦截器
1、feign远程调用丢失请求头问题
feign请求调用之前将之前请求拦截数据放到feign调用的拦截请求数据中;如下配置
@Configuration
public class FeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
HttpServletRequest request = requestAttributes.getRequest();//老请求
if (request != null) {
//同步请求头数据
String cookie = request.getHeader("Cookie");
template.header("Cookie", cookie);
}
}
}
};
}
}
2、feign远程异步调用丢失上下文问题
异步情况下保证主线程的ThreadLocal和附线程用同一个线程
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
CompletableFuture.runAsync(() -> {
//附带当前请求拦截器数据
RequestContextHolder.setRequestAttributes(requestAttributes);
//TODO
}, executor);