跨应用的链路追踪

1. 为什么需要链路追踪

  1. 理解复杂的调用链路。在微服务架构中,一个用户请求通常会跨越多个服务、数据库、缓存等组件。链路追踪可以帮助你清晰地看到每个请求在整个系统中的完整路径,包括经过的所有服务及其依赖关系。

  2. 快速定位性能瓶颈。通过链路追踪,你可以精确地测量每个服务的响应时间,并识别出哪些服务或组件是导致延迟的主要原因。这对于优化系统性能至关重要。

  3. 故障排查与诊断。当系统出现错误时,链路追踪可以提供详细的上下文信息,帮助你更快地定位问题的根本原因。它可以显示请求在每个服务中的执行情况,以及每个服务返回的状态码和错误信息。

  4. 跨服务的事务一致性。在分布式系统中,确保跨多个服务的事务一致性是一个挑战。链路追踪可以帮助你跟踪和验证这些跨服务的操作是否按预期执行,并确保数据的一致性。

  5. 提高开发和运维效率。链路追踪提供了丰富的上下文信息,使得开发人员和运维人员能够更高效地协作。开发人员可以通过追踪信息快速找到代码中的问题,而运维人员则可以利用这些信息进行系统维护和优化。

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. 引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>
  2. 修改配置文件 (按需,非必要)

    1
    2
    3
    4
    spring:
    sleuth:
    sampler:
    probability: 1.0 # 设置采样率,按需
  3. 修改日志模板, ,我这里是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>
  4. 重启项目,观察打印日志

效果:

image-20250313094420295

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项目

  1. docker-compose安装zipkin

    1
    2
    3
    4
    5
    6
    7
    8
    services:
    zipkin:
    image: openzipkin/zipkin:latest
    container_name: zipkin
    ports:
    - "9411:9411"
    environment:
    - JAVA_OPTS=-Xms1g -Xmx1g # 根据需要调整内存设置
  2. 引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>
  3. 修改配置文件

    1
    2
    3
    4
    spring:
    zipkin:
    # 连接 zipkin 服务端的地址,接口被调用后,调用相关信息通过这个 url 发送到 zipkin 服务端
    base-url: http://localhost:9411
  4. 访问http://localhost:9411, 输入traceId 查看效果

    image-20250313213613439

TIPS:

  • 如果不想使用http长连接,可以改成使用rabbitMQ收集数据
  • zipkin默认存储在内存,即服务重启会数据丢失,可以考虑用ES等做数据持久化
  • zipkin只用于轻量级的链路追踪,如果需要更全面的监控服务、数据库、redis等中间件,可以考虑skywalking

4. 集成ELK实现日志检索

docker搭建ELK

5. 更强大的链路追踪工具—skywalking

skywalking


跨应用的链路追踪
http://example.com/跨应用的链路追踪/
作者
Panyurou
发布于
2025年3月13日
许可协议