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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_31122833/article/details/98736447

场景:项目在网关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数据的问题

猜你喜欢

转载自blog.csdn.net/qq_31122833/article/details/98736447
今日推荐