本文作者:suxingrui
本文链接:https://blog.csdn.net/suxingrui/article/details/103789078
版权声明:本文为原创文章,转载请注明出处。
回顾2019年碰到的问题及解决方式
问题:Spring Cloud中使用Feign,如何跟踪请求日志链路
问题发现:
问题虽然描述得不简单,但实际就是使用Feign调度的时候,如何传递TraceId,且不修改请求的方式
调查分析:
没有分析,只要记得有请求拦截器RequestInterceptor就能简单实现
解决方法:
1、实现请求拦截器
/**
* Feign请求拦截器
*
* @author suxingrui
* @time 2019/9/8 9:49
**/
public class FeignRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("traceId", TraceIdHolder.get());
}
}
2、调用方添加Bean
@Bean
public FeignRequestInterceptor feignRequestInterceptor() {
return new FeignRequestInterceptor();
}
3、被调用方在WebFilter中获取traceId
/**
* @author suxx
* @version V1.0.0
* @date 2016-08-21 00:42:29
*/
@Slf4j
public class WebFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) {
String threadName = Thread.currentThread().getName();
long requestTime = System.currentTimeMillis();
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String traceId = new HttpRequestParameter(request).getParameter("traceId");
if (StringUtils.isNotBlank(traceId)) {
TraceIdHolder.set(traceId);
} else {
TraceIdHolder.create();
}
Thread.currentThread().setName(threadName + "-" + TraceIdHolder.get());
...
filterChain.doFilter(servletRequest, servletResponse);
} catch (Throwable e) {
log.error("cost:{}ms uncatch throwable:", System.currentTimeMillis() - requestTime, e);
} finally {
Thread.currentThread().setName(threadName);
TraceIdHolder.remove();
}
}
}