跨应用的链路追踪
1. 为什么需要链路追踪
理解复杂的调用链路。在微服务架构中,一个用户请求通常会跨越多个服务、数据库、缓存等组件。链路追踪可以帮助你清晰地看到每个请求在整个系统中的完整路径,包括经过的所有服务及其依赖关系。
快速定位性能瓶颈。通过链路追踪,你可以精确地测量每个服务的响应时间,并识别出哪些服务或组件是导致延迟的主要原因。这对于优化系统性能至关重要。
故障排查与诊断。当系统出现错误时,链路追踪可以提供详细的上下文信息,帮助你更快地定位问题的根本原因。它可以显示请求在每个服务中的执行情况,以及每个服务返回的状态码和错误信息。
跨服务的事务一致性。在分布式系统中,确保跨多个服务的事务一致性是一个挑战。链路追踪可以帮助你跟踪和验证这些跨服务的操作是否按预期执行,并确保数据的一致性。
提高开发和运维效率。链路追踪提供了丰富的上下文信息,使得开发人员和运维人员能够更高效地协作。开发人员可以通过追踪信息快速找到代码中的问题,而运维人员则可以利用这些信息进行系统维护和优化。
2. Sleuth
1. sleuth是什么?
Spring Cloud Sleuth 是一个用于分布式追踪的库,主要用于简化在微服务架构中实现链路追踪(Distributed Tracing)。它帮助开发者在复杂的分布式系统中跟踪请求的完整路径,从而更容易地进行性能监控、故障排查和问题诊断。
2. 主要功能
- 链路追踪(Distributed Tracing):
为每个请求生成唯一的追踪ID(Trace ID),并为每个服务调用生成唯一的跨度ID(Span ID)。
这些ID会随着请求在不同服务之间的传递而保持一致,使得你可以清晰地看到整个请求的调用链路。 - 日志关联(Log Correlation):
将追踪ID和跨度ID自动添加到日志记录中,确保所有相关的日志条目都可以通过这些ID进行关联。
这有助于在日志中快速定位和分析特定请求的所有相关日志信息。 - 集成第三方追踪系统:
支持与多种分布式追踪系统集成,如Zipkin、Jaeger等,将追踪数据发送到这些系统进行可视化和进一步分析。 - 采样率控制:
提供采样机制,允许你控制哪些请求需要被追踪,以避免生成过多的数据影响系统性能。
2. 调用链路模型
Spring Cloud Sleuth 主要通过自动注入的上下文信息(如 TraceContext)和 AOP(面向切面编程)来实现链路追踪。
2. 集成Springboot项目
引入依赖
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>修改配置文件 (按需,非必要)
1
2
3
4spring:
sleuth:
sampler:
probability: 1.0 # 设置采样率,按需修改日志模板, ,我这里是log4j2.xml
1
2
3<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="xxx[%style{%X{X-B3-TraceId}}{green},%style{%X{X-B3-SpanId}}{yellow},%X{X-B3-ParentSpanId}] xxx"/>
</Console>重启项目,观察打印日志
效果:
3. Sleuth与Zipkin集成
1. ZIpKin是什么?
Zipkin 是一个开源的分布式追踪系统,由 Twitter 开发并开源。它主要用于收集和展示微服务架构中的链路追踪数据,帮助开发者和运维人员更好地理解、监控和诊断复杂的分布式系统。
2. 主要功能
- 分布式追踪:
Zipkin 支持分布式追踪,能够跟踪一个请求在多个服务之间的传递过程,并生成详细的调用链路图。 - 可视化界面:
提供了一个直观的 Web UI,用于查看和分析追踪数据,包括每个请求的详细路径、延迟时间、错误信息等 - 多种数据传输方式:
支持通过 HTTP、Kafka、RabbitMQ 等多种方式进行数据传输,灵活适应不同的应用场景。 - 集成多种语言和框架:
支持多种编程语言(如 Java、Python、Go、Node.js 等)和框架(如 Spring Cloud Sleuth、Finagle 等),方便在不同技术栈中使用。 - 采样机制:
为了减少性能开销,Zipkin 提供了采样机制,允许你控制哪些请求需要被追踪。 - 存储支持:
支持多种存储后端,如内存、Elasticsearch、Cassandra 等,便于长期保存和查询追踪数据。
2. 集成Springboot项目
docker-compose安装zipkin
1
2
3
4
5
6
7
8services:
zipkin:
image: openzipkin/zipkin:latest
container_name: zipkin
ports:
- "9411:9411"
environment:
- JAVA_OPTS=-Xms1g -Xmx1g # 根据需要调整内存设置引入依赖
1
2
3
4<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>修改配置文件
1
2
3
4spring:
zipkin:
# 连接 zipkin 服务端的地址,接口被调用后,调用相关信息通过这个 url 发送到 zipkin 服务端
base-url: http://localhost:9411访问http://localhost:9411, 输入traceId 查看效果
TIPS:
- 如果不想使用http长连接,可以改成使用rabbitMQ收集数据
- zipkin默认存储在内存,即服务重启会数据丢失,可以考虑用ES等做数据持久化
- zipkin只用于轻量级的链路追踪,如果需要更全面的监控服务、数据库、redis等中间件,可以考虑skywalking