日常摸的时候,码云上发现一个轻量级的分布式日志系统 PlumeLog ,就尝试使用了一下。发现 spring-cloud架构的traceID获取有问题。
1、 使用了 plumelog之后就不要使用 spring-cloud-starter-zipkin 了 两个只能用一个,否则plumelog生成的traceID会被 zipkin覆盖。(所以使用链路功能时,要根据自己的需求 采用那种模式)
2、关于fegin 请求链路追踪的问题。
实现 新建 UserInterceptor类 实现 HandlerInterceptor 接口
重写 preHandle 方法 将traceId 生成
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceId = request.getHeader(TRACEID);
if (com.plumelog.core.util.StringUtils.isEmpty(traceId)){
TraceId.set();
}else{
TraceId.logTraceID.set(traceId);
}
return true;
}
3、 TraceIdBean
public class TraceIdBean {
@Bean
public RequestInterceptor traceIdInterceptor() {
return new TraceIdInterceptor();
}
}
4、TraceIdInterceptor 实现 apply 方法
public class TraceIdInterceptor implements RequestInterceptor {
private static final String TRACEID= "traceId";
@Override
public void apply(RequestTemplate template) {
String traceId = TraceId.logTraceID.get();
if (StringUtils.isNotEmpty(traceId)){
template.header(TRACEID,traceId);
}
}
}
5、被追踪的接口加上@Trace
6、fegin 调用 配置 configuration
@FeignClient(name = "test-demo", configuration = TraceIdBean.class)
public interface TestLogProvider {
@GetMapping(value = "/test")
String test();
}
7、 config 注入
@Configuration
public class WebServerMvcConfigurerAdapter implements WebMvcConfigurer {
@Bean
public HandlerInterceptor userInterceptor() {
return new UserInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userInterceptor());
}
}
8、 这样就可以获取追踪链路了
效果