Spring Cloud Sleuth 是 Spring Cloud 项目中的一个分布式追踪解决方案,旨在帮助开发者对微服务架构中的调用链路进行追踪和分析。它可以自动地为请求分配唯一的标识符,并在不同的服务之间传递这些标识符,以便在调用链中记录请求的详细信息。Sleuth 可以与多种分布式追踪系统集成,如 Zipkin 和 Jaeger,用于可视化和分析请求的流向。
我们将创建一个简单的 Spring Boot 微服务应用,包括两个服务:service-a
和 service-b
,并使用 Spring Cloud Sleuth 进行追踪。
service-a
:调用 service-b
并记录调用链信息。service-b
:提供一个简单的 REST API,被 service-a
调用。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);
}
}
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
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
分别启动 service-a
和 service-b
项目:
ServiceAApplication
。ServiceBApplication
。使用 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
在日志中,我们可以看到 traceId
和 spanId
用于标识请求的追踪信息。
我们可以将 Spring Cloud Sleuth 与 Zipkin 集成,以便可视化追踪信息。
在 service-a
和 service-b
的 pom.xml
中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
在 src/main/resources/application.yml
中添加以下配置:
spring:
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1.0
可以通过 Docker 启动一个 Zipkin 实例:
docker run -d -p 9411:9411 openzipkin/zipkin
启动所有服务后,访问 http://localhost:9411 查看追踪信息。在 Zipkin UI 中,可以查看请求的调用链、请求耗时等详细信息。
Spring Cloud Sleuth 为微服务架构提供了强大的分布式追踪功能,通过与 Zipkin 等工具的集成,可以实现对请求调用链的可视化和分析。在实际应用中,可以根据需求调整 Sleuth 的配置,以满足不同的追踪需求。
如果您有任何问题或需要进一步的帮助,请随时告诉我!