开始
1. Spring Cloud Sleuth 简介
Spring Cloud Sleuth 为 Spring Cloud 提供分布式跟踪解决方案的 API。它与 OpenZipkin Brave 集成
Spring Cloud Sleuth 能够跟踪您的请求和消息,以便您可以将该通信与相应的日志条目相关联。您还可以将跟踪信息导出到外部系统以可视化延迟。Spring Cloud Sleuth 直接支持 OpenZipkin 兼容系统。
1.1. 术语
Spring Cloud Sleuth 借用了 Dapper 的术语。
跨度:基本工作单元。例如,发送 RPC 是一个新跨度,向 RPC 发送响应也是如此。跨度还有其他数据,例如描述、时间戳事件、键值注释(标记)、导致它们的跨度的 ID 以及进程 ID(通常是 IP 地址)。
跨度可以启动和停止,它们会跟踪其计时信息。创建跨度后,必须在将来的某个时间点停止它。
跟踪: 形成树状结构的一组跨度。例如,如果运行分布式大数据存储,则跟踪可能由PUT
请求。
注解/事件:用于及时记录事件的存在。
从概念上讲,在典型的 RPC 场景中,我们标记这些事件以突出发生的作类型(这并不意味着物理上此类事件将设置在跨度上)。
-
cs:客户端已发送。客户端已发出请求。此注释指示跨度的开始。
-
sr:Server Received:服务器端收到请求并开始处理。减去
cs
timestamp 显示网络延迟。 -
ss:服务器已发送。在请求处理完成后(当响应发送回客户端时)进行注释。减去
sr
timestamp 显示服务器端处理请求所需的时间。 -
cr:客户端已接收。表示跨度的结束。客户端已成功收到来自服务器端的响应。减去
cs
timestamp 显示客户端接收来自服务器的响应所需的全部时间。
下图显示了 Span 和 Trace 在系统中的外观。

音符的每种颜色都表示一个跨度(有七个跨度 - 从 A 到 G)。考虑以下注释:
Trace Id = X
Span Id = D
Client Sent
此说明表示当前 Span 的 Trace Id 设置为 X,Span Id 设置为 D。此外,从 RPC 的角度来看,Client Sent
事件发生了。
让我们考虑更多笔记:
Trace Id = X
Span Id = A
(no custom span)
Trace Id = X
Span Id = C
(custom span)
您可以继续使用创建的范围(例如no custom span
指示)或您可以手动创建子跨度(例如custom span
适应症)。
下图显示了跨度的父子关系的外观:

2. 开发您的第一个基于 Spring Cloud 侦探的应用程序
本节介绍如何开发一个小型的“Hello World!” Web 应用程序,该应用程序突出显示了 Spring Cloud Sleuth 的一些关键特性。我们使用 Maven 来构建这个项目,因为大多数 IDE 都支持它。作为跟踪器实现,我们将使用 OpenZipkin Brave。
您可以通过转到 start.spring.io 并从依赖项搜索器中选择“Web”和“Spring Cloud Sleuth”Starters来快捷执行以下步骤。这样做会生成一个新的项目结构,以便您可以立即开始编码。 |
2.1. 创建 POM
我们需要从创建一个 Maven 开始pom.xml
文件。
这pom.xml
是用于构建项目的配方。
打开您最喜欢的文本编辑器并添加以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myproject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- Use the latest compatible Spring Boot version. You can check https://spring.io/projects/spring-cloud for more information -->
<version>$2.4.10</version>
</parent>
<!-- Spring Cloud Sleuth requires a Spring Cloud BOM -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<!-- Provide the latest stable Spring Cloud release train version (e.g. 2020.0.0) -->
<version>${release.train.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- (you don't need this if you are using a GA version) -->
<repositories>
<repository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
<snapshots><enabled>true</enabled></snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<url>https://repo.spring.io/snapshot</url>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
</pluginRepositories>
</project>
前面的列表应该会给你一个有效的构建。
您可以通过运行mvn package
(目前,您可以忽略“jar 将为空 - 没有内容被标记为包含!
此时,您可以将项目导入到 IDE 中(大多数现代 Java IDE 都包含对 Maven 的内置支持)。 为简单起见,我们在此示例中继续使用纯文本编辑器。 |
2.2. 添加类路径依赖项
要添加必要的依赖项,请编辑pom.xml
并将spring-boot-starter-web
紧接在parent
部分:
<dependencies>
<!-- Boot's Web support -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Sleuth with Brave tracer implementation -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
</dependencies>
2.3. 编写代码
要完成我们的应用程序,我们需要创建一个 Java 文件。
默认情况下,Maven 从src/main/java
,因此您需要创建该目录结构,然后添加一个名为src/main/java/Example.java
以包含以下代码:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.*;
import org.springframework.boot.autoconfigure.*;
import org.springframework.web.bind.annotation.*;
@RestController
@EnableAutoConfiguration
public class Example {
private static final Logger log = LoggerFactory.getLogger(Backend.class);
@RequestMapping("/")
String home() {
log.info("Hello world!");
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Example.class, args);
}
}
虽然这里没有太多代码,但正在发生很多事情。 我们将在接下来的几节中逐步介绍重要部分。
@RestController和@RequestMapping注释
Spring Boot 设置 Rest Controller 并使我们的应用程序绑定到 Tomcat 端口。 带有 Brave tracer 的 Spring Cloud Sleuth 将提供传入请求的检测。
2.4. 运行示例
此时,您的应用程序应该可以工作。
由于您使用了spring-boot-starter-parent
POM,你有一个有用的run
可用于启动应用程序的目标。
类型SPRING_APPLICATION_NAME=backend mvn spring-boot:run
从根项目目录启动应用程序。
您应该会看到类似于以下内容的输出:
$ mvn spring-boot:run . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ ... ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.222 seconds (JVM running for 6.514)
如果您打开 Web 浏览器以localhost:8080
,您应该会看到以下输出:
Hello World!
如果检查日志,您应该会看到类似的输出
2020-10-21 12:01:16.285 INFO [backend,0b6aaf642574edd3,0b6aaf642574edd3] 289589 --- [nio-9000-exec-1] Example : Hello world!
您可以注意到日志记录格式已更新为以下信息[backend,0b6aaf642574edd3,0b6aaf642574edd3
.
此条目对应于[application name,trace id, span id]
.
应用程序名称是从SPRING_APPLICATION_NAME
环境变量。
您可以将logging.level.org.springframework.web.servlet.DispatcherServlet=DEBUG . |
要正常退出应用程序,请按ctrl-c
.
3. 后续步骤
希望本节提供了一些 Spring Cloud Sleuth 基础知识,并帮助您开始编写自己的应用程序。 如果你是一个面向任务的开发人员类型,你可能想跳转到 spring.io 并查看一些入门指南,这些指南可以解决特定的“如何使用 Spring 做到这一点? 我们还有特定于 Spring Cloud Sleuth 的“作方法”参考文档。
否则,下一个合乎逻辑的步骤是阅读使用 Spring Cloud Sleuth。 如果你真的不耐烦,你也可以跳到前面阅读有关 Spring Cloud Sleuth 功能的信息。
您可以在示例中找到默认项目示例。