目录
为了简化后续做类似功能的童鞋操作,故整理一篇针对traceId和自定义属性全链路传递的处理操作,整体调试流程还是耽误了不少时间的。
要做的目标
实现全链路traceId传递,自定义全链路traceUrl标记(traceUrl的规则是比如:比如A-》B-》 C 这样得到的就是 traceUrl=/A/B/C)
思路
1.依赖sleuth传递各种信息 ,使用方式遵循它的规则
2.feign调用处增加处理标记逻辑
3.web服务入口处增加拦截处理标记逻辑
4.异步线程池处理逻辑(sleuth自带功能)
实现
1.项目封装一个基础的jar包,比如trace-jar
A.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
B.代码编写
//AOP处理feign逻辑前
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.util.StringUtils;
@Aspect
public class FeignClientTraceAop {
@Around("@within(org.springframework.cloud.openfeign.FeignClient)")
Object around(final ProceedingJoinPoint pjp) throws Throwable {
String traceUrl = Tracer.getBaggage(TraceConstants.TRACE_KEY_TRACE_URL);
if (!StringUtils.hasText(traceUrl)) {
Tracer.createBaggage(TraceConstants.TRACE_KEY_TRACE_URL, TraceConstants.DELIMITER + TraceConstants.getLocalAppName());
}
return pjp.proceed();
}
}
//常量类
import org.springframework.util.StringUtils;
public final class TraceConstants {
public static final String TRACE_KEY_TRACE_ID = "traceId";
public static final String TRACE_KEY_TRACE_URL = "traceUrl";
public static final String DELIMITER = "/";
public static final String APP_NAME_KEY = "appcode";
public static final String APP_NAME_DEFAULT = "MIS_APP_NAME";
private static String appName = null;
public static String getLocalAppNa