# Spring Boot 中如何使用 Spring Cloud Sleuth 来实现分布式跟踪?

news/2024/10/30 23:25:35/

Spring Boot 中如何使用 Spring Cloud Sleuth 来实现分布式跟踪?

在微服务架构中,通常会有多个服务相互协作,为了方便排查问题,我们需要对服务之间的调用进行跟踪。Spring Cloud Sleuth 是 Spring Cloud 生态中的分布式跟踪解决方案,它可以帮助我们追踪请求在微服务系统中的传递路径,以及记录每个服务的处理时间等信息。

本文将介绍如何在 Spring Boot 中使用 Spring Cloud Sleuth 来实现分布式跟踪。我们将使用 Zipkin 作为跟踪数据的存储和展示工具,并通过一个简单的示例来演示 Spring Cloud Sleuth 的使用。

在这里插入图片描述

准备工作

在开始本文之前,我们需要先准备以下环境:

  • JDK 8 或以上版本
  • Maven 3.2 或以上版本
  • Zipkin Server

本文将使用 Spring Boot 2.5.1 和 Spring Cloud 2020.0.3 版本。

创建 Spring Boot 项目

首先,我们需要创建一个新的 Spring Boot 项目。可以使用 Spring Initializr 来快速创建项目,也可以手动创建项目。

使用 Spring Initializr 创建项目

访问 https://start.spring.io/,选择需要的配置项,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZcZ10WlW-1684986080957)(null)]

然后点击 Generate 按钮,下载生成的项目压缩包。

手动创建项目

在本地创建一个空文件夹,然后在命令行中进入该文件夹,执行以下命令:

$ mkdir spring-cloud-sleuth-demo
$ cd spring-cloud-sleuth-demo
$ mkdir -p src/main/java/com/example/demo
$ mkdir -p src/main/resources
$ touch src/main/java/com/example/demo/DemoApplication.java
$ touch src/main/resources/application.properties

然后在 DemoApplication.java 文件中添加以下代码:

package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

application.properties 文件中添加以下配置:

spring.application.name=spring-cloud-sleuth-demo
server.port=8080

这里我们创建了一个名为 spring-cloud-sleuth-demo 的 Spring Boot 应用程序,并设置了应用程序的名称和端口号。

添加 Spring Cloud Sleuth 依赖

要使用 Spring Cloud Sleuth,我们需要在项目中添加以下依赖:

<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2020.0.3</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency>
</dependencies>

这里使用了 Spring Cloud 的依赖管理,以及 Spring Cloud Sleuth 的启动器依赖。

配置 Zipkin Server

Zipkin 是一个分布式跟踪系统,它可以显示跨多个服务的请求的跟踪信息。我们需要配置 Zipkin Server,以便在本地环境中使用它来存储和展示跟踪数据。

下载 Zipkin Server

首先,我们需要下载 Zipkin Server。可以从 https://zipkin.io/pages/quickstart.html 下载 Zipkin Server 的最新版。也可以使用以下命令下载和启动 Zipkin Server:

$ curl -sSL https://zipkin.io/quickstart.sh | bash -s
$ java -jar zipkin.jar

执行以上命令后,Zipkin Server 将启动在默认端口 9411 上。

配置 Spring Cloud Sleuth

要使用 Spring Cloud Sleuth,我们需要在 Spring Boot 应用程序的配置文件中添加以下配置:

spring.sleuth.sampler.probability=1.0
spring.zipkin.base-url=http://localhost:9411/

这里设置了采样率为 1.0,表示对所有的请求都进行采样。同时,指定了 Zipkin Server 的地址,以便将跟踪数据发送到 Zipkin Server。

编写示例代码

在本文中,我们将创建两个微服务,一个是 hello-service,另一个是 world-servicehello-service 会调用 world-service,并在调用结束后返回结果。

创建 hello-service

创建一个名为 hello-service 的 Spring Boot应用程序。在 pom.xml 文件中添加以下依赖:

<dependencies><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>
</dependencies>

这里除了 Spring Cloud Sleuth 的依赖之外,还添加了 OpenFeign 的依赖,以便调用 world-service

application.properties 文件中添加以下配置:

spring.application.name=hello-service
server.port=8081

然后创建一个名为 Greeting 的类,用于表示返回的结果:

public class Greeting {private String message;public Greeting() {}public Greeting(String message) {this.message = message;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

接下来创建一个名为 HelloController 的类,用于接收请求并调用 world-service

@RestController
public class HelloController {@Autowiredprivate WorldClient worldClient;@GetMapping("/hello")public Greeting sayHello(@RequestParam String name) {String worldMessage = worldClient.getWorldMessage();String message = String.format("Hello, %s! %s", name, worldMessage);return new Greeting(message);}
}

这里使用了 @Autowired 注解自动注入了 WorldClient,并在 sayHello 方法中调用了 worldClient.getWorldMessage() 方法,获取 world-service 的响应结果,并将结果与 Hello, ${name}! 拼接为最终的返回结果。

最后,创建一个名为 WorldClient 的接口,并使用 @FeignClient 注解标记该接口,以便使用 OpenFeign 进行远程调用:

@FeignClient(name = "world-service")
public interface WorldClient {@GetMapping("/world")String getWorldMessage();
}

这里使用了 @FeignClient 注解,指定了被调用的服务名为 world-service,并定义了一个 getWorldMessage 方法用于获取 world-service 的响应结果。

创建 world-service

创建一个名为 world-service 的 Spring Boot 应用程序。在 pom.xml 文件中添加以下依赖:

<dependencies><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>
</dependencies>

这里只添加了 Spring Cloud Sleuth 的依赖。

application.properties 文件中添加以下配置:

spring.application.name=world-service
server.port=8082

然后创建一个名为 WorldController 的类,用于接收请求并返回响应:

@RestController
public class WorldController {@GetMapping("/world")public String sayWorld() {return "World!";}
}

这里只是简单地返回了一个字符串 “World!”。

测试分布式跟踪

在完成以上步骤后,我们可以启动 hello-serviceworld-service,并访问 http://localhost:8081/hello?name=John,可以看到返回结果为 Hello, John! World!

此时,我们可以通过访问 Zipkin Server 的 Web 界面来查看分布式跟踪数据。在浏览器中输入 http://localhost:9411/zipkin/,然后点击 Find Traces 按钮,可以看到所有的跟踪数据,如下图所示:

可以看到,hello-serviceworld-service 都被成功地追踪到了,并且可以查看它们之间的调用关系和耗时等信息。

总结

本文介绍了如何在 Spring Boot 中使用 Spring Cloud Sleuth 来实现分布式跟踪。我们通过一个简单的示例演示了如何使用 Spring Cloud Sleuth 对微服务之间的调用进行跟踪,并使用 Zipkin 来存储和展示跟踪数据。

使用 Spring Cloud Sleuth 不仅可以方便地排查问题,同时也可以帮助我们了解微服务系统的性能瓶颈和瓶颈所在服务,从而更好地优化系统。


http://www.ppmy.cn/news/92236.html

相关文章

CentOS7磁盘空间缩减

在 CentOS 7 操作系统中&#xff0c;有时您需要缩减磁盘空间以释放存储资源。本篇文章将为您介绍如何缩减 CentOS 7 磁盘空间。 在开始缩减磁盘空间之前&#xff0c;请务必确保已经做好了备份工作&#xff0c;以免造成数据丢失。虽然缩减磁盘空间不会删除您的数据&#xff0c;…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏&#xff0c;消费者心智和市场趋势逐渐发生变化&#xff0c;零售市场竞争步入深水区&#xff0c;为品牌带来了更大考验。但反过来&#xff0c;也令更多潜力股加速崛起。 北京时间5月16日&#xff0c;名创优品集团&#xff08;NYSE:MNSO;HKEX: 9896&#xff09;公布…

HTTP协议、 HTTPS协议,SSL协议及完整交互过程

HTTP协议、 HTTPS协议&#xff0c;SSL协议及完整交互过程&#xff1b; HTTPS协议&#xff0c;SSL协议及完整交互过程 SSL 1. 安全套接字&#xff08;Secure Socket Layer&#xff0c;SSL&#xff09;协议是Web浏览器与Web服务器之间安全交换信息的协议。 2. SSL协议的三…

搜索二维矩阵——力扣74

文章目录 题目描述法一&#xff09;一次二分查找法二&#xff09;两次二分查找法三&#xff09;抽象二叉搜索树BST解法 题目描述 法一&#xff09;一次二分查找 首先分析题目&#xff1a;由于①每行的整数从左到右升序&#xff1b;②每行的第一个整数>前一行的最后一个整数&…

一文读懂 Java 递归,你不得不会的技能

Java递归是指在方法的执行过程中&#xff0c;通过调用自身的方式来实现重复执行一段代码的机制。它是一种非常有用的编程技术&#xff0c;特别是在处理树形数据结构或者分治算法时&#xff0c;递归能够简化代码实现&#xff0c;并使代码更易于理解和维护。 一、递归的基本原理…

2023电工杯B题全保姆教程及代码 人工智能对大学生学习影响的评价

A题&#xff1a;人工智能对大学生学习影响的评价 人工智能简称AI&#xff0c;最初由麦卡锡、明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出。2016年&#xff0c;人工智能AlphaGo 4:1战胜韩国围棋高手李世石&#xff0c;期后波士顿动力公司的人形机器人Atlas也展示了…

python+vue垃圾分类论坛的设计与实现85l30

环境保护是一项利国利民的重大民生工程,是造福子孙后代的幸福事,基于全面分析我国大学生环境保护教育现状的基础上提出了高校可通过开设环境类通识任选课、专业课中融入环境保护教育、环境保护实践教学、环境保护第二课堂等有效途径加强对非环境类专业大学生环境保护教育。 本系…

nest配置及环境变量

配置 配置问题&#xff1a; 直接使用.env文件&#xff0c;则会出现大量的process.env.xx的写法&#xff0c;且只能单独一个个获取&#xff0c;无法直接获取对象。 配置方案&#xff1a; 使用useClass 环境变量的配置在.env里面配置后&#xff0c;需要引入到config/envs内部…