1、feign遠端調用丢失頭
解決:設定feign的求情攔截器
@Configuration
public class MyFeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor(){
RequestInterceptor requestInterceptor = requestTemplate -> {
//RequestContextHolder拿到剛進來的請求
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes!=null){
HttpServletRequest request = requestAttributes.getRequest();
if(request!=null){
//同步請求頭資料,cookie
requestTemplate.header("Cookie",request.getHeader("Cookie"));
}
}
};
return requestInterceptor;
}
}
2、Feign異步情況丢失上下文問題
由于feigb請求攔截器為新的request設定請求頭底層是使用ThreadLocal儲存剛進來的請求,是以在異步情況下,其他線程并不能擷取到主線程的ThreadLocal,是以也拿不到請求。
解決:先擷取主線程的ThreadLocal儲存的請求資料,再分别向其他線程中設定
//拿到主線程請求,放到各個異步任務中
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();//
CompletableFuture<Void> addrFuture = CompletableFuture.runAsync(() -> {
//設定到其他線程
RequestContextHolder.setRequestAttributes(requestAttributes);
//遠端調用查位址
List<MemberReceiveAddressVo> address = memberFeignService.getAddress(memberVo.getId());
orderConfirmVo.setAddressVos(address);
}, threadPoolExecutor);