package com.kidgrow.common.interceptor; import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.util.*; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @Description: 微服务之间feign调用请求头丢失的问题,加入微服务之间传递的唯一标识,便于追踪
* @Project:
* @CreateDate: Created in 2020/2/4 14:26
* @Author: liuke */ @Slf4j public class FeignRequestInterceptor implements RequestInterceptor { /** * 微服务之间传递的唯一标识 */ public static final String X_REQUEST_ID = "X-Request-Id"; @Override public void apply(RequestTemplate template) { HttpServletRequest httpServletRequest = getHttpServletRequest(); if(httpServletRequest!=null){ Map headers = getHeaders(httpServletRequest); // 传递所有请求头,防止部分丢失 Iterator> iterator = headers.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = iterator.next(); template.header(entry.getKey(), entry.getValue()); } // 微服务之间传递的唯一标识 if (httpServletRequest.getHeader(X_REQUEST_ID)==null) { String sid = String.valueOf(UUID.randomUUID()); template.header(X_REQUEST_ID, sid); } log.debug("FeignRequestInterceptor:{}", template.toString()); } } private HttpServletRequest getHttpServletRequest() { try { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } catch (Exception e) { return null; } } private Map getHeaders(HttpServletRequest request) { Map map = new LinkedHashMap<>(); Enumeration enumeration = request.getHeaderNames(); if(enumeration!=null){ while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); String value = request.getHeader(key); map.put(key, value); } } return map; } }