在Spring Boot的单体项目中实现Tracing(追踪)通常是为了监控和记录请求的生命周期,以便更好地理解应用内部的执行流。即使在单体应用中,追踪也能帮助你诊断性能问题、查看执行时间和日志关联、监控服务调用等。
1. 引入依赖
首先,在Spring Boot项目中添加Spring Cloud Sleuth和Zipkin的依赖。Spring Cloud Sleuth负责自动生成追踪信息,Zipkin负责存储和展示这些追踪信息。
Maven配置
<dependencies>
<!-- Spring Cloud Sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- Zipkin (用于存储追踪信息) -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
</dependencies>
2. 配置Spring Cloud Sleuth和Zipkin
然后,你需要在application.properties或application.yml中配置追踪系统,像Zipkin。
application.properties配置
# 启用Spring Cloud Sleuth
spring.sleuth.enabled=true
# Zipkin配置
spring.zipkin.baseUrl=http://localhost:9411 # Zipkin的地址
spring.zipkin.sender.type=web # 使用HTTP发送数据到Zipkin
# 设置追踪采样率,1.0表示所有请求都会被追踪
spring.sleuth.sampler.probability=1.0
# 自定义日志输出格式,包含traceId和spanId
logging.pattern.level=%5p [traceId=%X{X-B3-TraceId}, spanId=%X{X-B3-SpanId}] %m%n
3. 查看日志中的追踪信息
Spring Cloud Sleuth会自动生成traceId和spanId,并将它们包含在应用的日志中。你可以通过日志查看请求的追踪信息,方便你分析请求的生命周期。
通过上述配置,你的应用日志将会像这样输出:
INFO [traceId=bb1e4cb28c9b5c91, spanId=9a99cdd902e0a850] Hello, world!
4. 启动Zipkin服务(可选)
如果你想使用Zipkin来存储和可视化追踪数据,你可以启动一个Zipkin服务。最简单的方式是通过Docker来启动Zipkin:
docker run -d -p 9411:9411 openzipkin/zipkin
访问http://localhost:9411,你就可以查看到通过Spring Cloud Sleuth发送的追踪信息。
5. 控制器示例(自动追踪)
Spring Cloud Sleuth会自动为所有的HTTP请求生成追踪信息。你不需要为每个控制器或者方法手动添加代码。它会为所有的HTTP请求自动创建Span并将它们传递给日志系统。你可以在日志中查看这些信息。
示例Controller:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.cloud.sleuth.Tracer;
@RestController
public class HelloController {
private final Tracer tracer;
public HelloController(Tracer tracer) {
this.tracer = tracer;
}
@GetMapping("/hello")
public String hello() {
// 获取当前traceId
String traceId = tracer.currentSpan().context().traceId();
return "Hello, traceId: " + traceId;
}
}
在上面的代码中,Tracer对象是Spring Cloud Sleuth提供的,它可以用来访问当前的追踪信息(如traceId和spanId)。每次调用/hello接口时,都会输出当前的traceId,并通过日志将该信息记录下来。
6. 自定义Span(可选)
如果你希望手动控制Span(比如在非HTTP请求中),可以通过Spring Cloud Sleuth提供的Tracer来创建自定义的Span。
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.stereotype.Service;
@Service
public class MyService {
private final Tracer tracer;
public MyService(Tracer tracer) {
this.tracer = tracer;
}
public void executeCustomLogic() {
// 手动创建一个新的Span
tracer.nextSpan().name("customSpan").start();
// 执行某些操作
// ...
// 完成Span
tracer.currentSpan().end();
}
}
总结
在Spring Boot单体项目中实现Tracing,可以通过以下步骤:
- 引入Spring Cloud Sleuth和Zipkin依赖。
- 配置Zipkin或其他追踪系统的基本信息。
- 通过日志查看traceId和spanId。
- 使用Spring Cloud Sleuth自动追踪HTTP请求,或者手动创建Span进行追踪。
Spring Cloud Sleuth能够为你提供强大的分布式追踪能力,便于分析和排查问题,即使在单体应用中也能帮助你更好地监控系统。