Spring Cloud Sleuth

class Spring Cloud Sleuth

Spring Cloud Sleuth 是 Spring Cloud 项目中的一个分布式追踪解决方案,旨在帮助开发者对微服务架构中的调用链路进行追踪和分析。它可以自动地为请求分配唯一的标识符,并在不同的服务之间传递这些标识符,以便在调用链中记录请求的详细信息。Sleuth 可以与多种分布式追踪系统集成,如 Zipkin 和 Jaeger,用于可视化和分析请求的流向。

Spring Cloud Sleuth 的核心概念

  1. Trace(追踪):一次请求在分布式系统中的调用链路。每个 Trace 都有一个唯一的 Trace ID。
  2. Span(跨度):一次请求在某个服务中的处理过程。一个 Trace 可以包含多个 Span。每个 Span 都有一个唯一的 Span ID。
  3. Propagation(传播):在服务之间传递 Trace ID 和 Span ID。
  4. Baggage(行李):用于在调用链中传递的自定义数据。

使用 Spring Cloud Sleuth 进行分布式追踪

我们将创建一个简单的 Spring Boot 微服务应用,包括两个服务:service-aservice-b,并使用 Spring Cloud Sleuth 进行追踪。

项目结构

  • service-a:调用 service-b 并记录调用链信息。
  • service-b:提供一个简单的 REST API,被 service-a 调用。

1. 创建 service-a

添加依赖

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

创建应用主类

package com.example.servicea;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class ServiceAApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }
}

创建 Feign 客户端

package com.example.servicea;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(name = "service-b", url = "http://localhost:8081")
public interface ServiceBClient {

    @GetMapping("/api/service-b")
    String callServiceB();
}

创建控制器

package com.example.servicea;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceAController {

    @Autowired
    private ServiceBClient serviceBClient;

    @GetMapping("/api/service-a")
    public String callServiceB() {
        return "Response from Service B: " + serviceBClient.callServiceB();
    }
}

配置文件

src/main/resources/application.yml 中添加以下配置:

server:
  port: 8080

spring:
  application:
    name: service-a

2. 创建 service-b

添加依赖

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

创建应用主类

package com.example.serviceb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServiceBApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }
}

创建控制器

package com.example.serviceb;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ServiceBController {

    @GetMapping("/api/service-b")
    public String serviceBEndpoint() {
        return "Hello from Service B!";
    }
}

配置文件

src/main/resources/application.yml 中添加以下配置:

server:
  port: 8081

spring:
  application:
    name: service-b

3. 启动项目

分别启动 service-aservice-b 项目:

  1. 启动 ServiceAApplication
  2. 启动 ServiceBApplication

4. 测试追踪功能

使用 Curl 或 Postman 测试服务调用:

curl http://localhost:8080/api/service-a

该请求将通过 service-a 调用 service-b,并在控制台输出追踪信息,类似于:

service-a 日志输出:

2024-07-30 12:00:00.000  INFO [service-a,traceId=1234567890abcdef,spanId=abcdef1234567890] 1 --- [nio-8080-exec-1] c.example.servicea.ServiceAController    : Calling Service B
2024-07-30 12:00:00.100  INFO [service-a,traceId=1234567890abcdef,spanId=abcdef1234567890] 1 --- [nio-8080-exec-1] c.example.servicea.ServiceAController    : Response from Service B: Hello from Service B!

service-b 日志输出:

2024-07-30 12:00:00.050  INFO [service-b,traceId=1234567890abcdef,spanId=1234567890abcdef] 1 --- [nio-8081-exec-1] c.example.serviceb.ServiceBController    : Received request for Service B

在日志中,我们可以看到 traceIdspanId 用于标识请求的追踪信息。

5. 集成 Zipkin 进行可视化追踪

我们可以将 Spring Cloud Sleuth 与 Zipkin 集成,以便可视化追踪信息。

添加 Zipkin 依赖

service-aservice-bpom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

配置 Zipkin

src/main/resources/application.yml 中添加以下配置:

spring:
  zipkin:
    base-url: http://localhost:9411
  sleuth:
    sampler:
      probability: 1.0
  • base-url:配置 Zipkin 服务的 URL。
  • sampler.probability:设置采样率为 100%,即所有请求都会被追踪。

启动 Zipkin

可以通过 Docker 启动一个 Zipkin 实例:

docker run -d -p 9411:9411 openzipkin/zipkin

访问 Zipkin UI

启动所有服务后,访问 http://localhost:9411 查看追踪信息。在 Zipkin UI 中,可以查看请求的调用链、请求耗时等详细信息。

小结

Spring Cloud Sleuth 为微服务架构提供了强大的分布式追踪功能,通过与 Zipkin 等工具的集成,可以实现对请求调用链的可视化和分析。在实际应用中,可以根据需求调整 Sleuth 的配置,以满足不同的追踪需求。

如果您有任何问题或需要进一步的帮助,请随时告诉我!

评论区
评论列表
menu