版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
场景:项目在网关Zuul中对请求Request进行了处理,(包括添加修改参数、添加addZuulRequestHeader等)。
问题:在不经过Feign声明式服务调用时发现不了问题,参数、RequestHeader都没有丢失,可正常调用;可当服务A调用了服务B时,服务B的Request就把之前网关Zuul做的处理数据都丢失了。
解决:
在子服务里添加如下代码,防止丢失处理过后的Request
@Configuration
public class FeginInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
Map<String,String> headers = getHeaders(getHttpServletRequest());
for(String headerName : headers.keySet()){
requestTemplate.header(headerName, getHeaders(getHttpServletRequest()).get(headerName));
}
}
private HttpServletRequest getHttpServletRequest() {
try {
return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private Map<String, String> getHeaders(HttpServletRequest request) {
Map<String, String> map = new LinkedHashMap<>();
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
String key = enumeration.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}
return map;
}
}
在子服务中的application.properties中添加如下配置:
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
测试,完美解决声明式服务调用Feign丢失在网关添加的Request Headers数据的问题