-
背景
微服务调用的时候请求不会传递参数.比如调用方服务请求头中有cookie存放sessionId,而被调用方服务没有请求头,从而没有cookie信息,也就不能根据cookie中存放的sessionId获取session信息,影响后续操作. -
解决办法
通过实现RequestInterceptor接口,完成对所有的Feign请求,传递请求头和请求参数。本质是通过ThreadLocal线程共享变量实现. -
单线程环境下代码实现
package com.kenai.gulimall.order.feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Configuration
public class GuliFeignConfig {
@Bean
public RequestInterceptor requestInterceptor(){
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate template) {
// RequestContextHolder拿到调用方请求
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 老请求
HttpServletRequest request = attributes.getRequest();
// 同步请求头数据-cookie
String cookie = request.getHeader("cookie");
// 给被调用方微服务同步调用方请求cookie
template.header("cookie", cookie);
}
};
}
}
-
多线程环境下feign远程调用丢失请求头问题
由于RequestInterceptor接口,传递请求头和请求参数,本质是通过ThreadLocal线程共享变量实现.所以使用线程池异步调用方法时,由于不是同一个线程所以会出现问题. -
多线程环境下feign远程调用丢失请求头问题解决方法
只需要从主线程中获取请求头信息,然后在异步调用方法中再重新set一下即可. -
多线程环境下feign远程调用丢失请求头问题代码实现