SpringCloud之声明式服务调用Feign丢失在网关添加的Request Headers数据

场景:项目在网关Zuul中对请求Request进行了处理,(包括添加修改参数、添加addZuulRequestHeader等)。

问题:在不经过Feign声明式服务调用时发现不了问题,参数、RequestHeader都没有丢失,可正常调用;可当服务A调用了服务B时,服务B的Request就把之前网关Zuul做的处理数据都丢失了。

解决

在子服务里添加如下代码,防止丢失处理过后的Request

@Configuration
public class FeginInterceptor implements RequestInterceptor {
 
    @Override
    public void apply(RequestTemplate requestTemplate) {
        Map 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 getHeaders(HttpServletRequest request) {
        Map map = new LinkedHashMap<>();
        Enumeration 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数据的问题

你可能感兴趣的:(项目搭建,SpringCloud,Hystrix,Zuul,后端开发)