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

news2024/12/23 4:55:40

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 {

    @Autowired
    private 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.coloradmin.cn/o/574281.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

charles使用

charles​ 一、概念​ charles是一款非常优秀的抓包工具&#xff0c;全平台支持&#xff0c;在mac&#xff0c;windows&#xff0c;linux上都可以使用&#xff0c;既可以抓 取web端的包&#xff0c;也可以抓app端的包。 ​ charles主要的功能包括如下几点&#xff1a; ​ 截取…

Linux网络服务:SSH远程访问及控制2

目录 一、理论 1.构建密钥对验证的SSH体系 2.TCP Wrappers访问控制 二、实验 1.ecdsa免密连接 2.rsa免密连接 一、理论 1.构建密钥对验证的SSH体系 &#xff08;1&#xff09;免密连接原理 ① 手动添加客户端的公钥到服务端 ② 服务端收到客户端的公钥后使用客户端公钥…

C++——引用

引用的概念 初步理解&#xff1a;引用相当于给变量取了一个别名&#xff0c;它和引用的变量共用同一块空间。 就好比孙悟空有很多外号&#xff0c;例如孙行者&#xff0c;齐天大圣&#xff0c;斗战胜佛&#xff0c;但是它们所指都是孙悟空。同样的&#xff0c;如果齐天大圣大…

如何在 Ubuntu 22.04 上安装 Python Pip?

Python Pip 是 Python 的包管理器&#xff0c;它允许您轻松地安装和管理 Python 包和库。在 Ubuntu 22.04 上安装 Python Pip 是非常简单的。 本文将详细介绍如何在 Ubuntu 22.04 上安装 Python Pip&#xff0c;并为您提供逐步指南。 步骤 1&#xff1a;更新软件包列表 在安装…

C Primer Plus第八章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.设计一个程序&#xff0c;统计在读到…

Yum使用方法

1.什么是软件包 在Linux下安装软件&#xff0c;有三种方法&#xff1a; 通过对源代码进行封装&#xff0c;并进行编译&#xff0c;得到可执行程序。rpm安装&#xff0c;rpm安装软件需要各种指令&#xff0c;对于小白来说不友好&#xff0c;容易出错。yum安装&#xff0c;解决…

六、Docker仓库之Harbor搭建(三)

Harbor搭建 一、Harbor简介 1.Harbor介绍 Harbor是一个用于存储Docker镜像的企业级镜像服务器&#xff0c;通过添加一些企业必需的功能特性&#xff0c;如安全、标识和管理等&#xff0c;大大扩展其功能。作为一个企业级私有镜像服务器&#xff0c;Harbor提供了更好的性能和安…

Modern CSV:大型 CSV 文件编辑器/查看器 Crack

Modern CSV用于快速查看大型 CSV 文件 适用于 Windows、Mac 和 Linux 的复杂 CSV 编辑器/查看器 被使用 电子商务运营商。数据科学家。会计师。 IT 专业人员。学生。医学研究人员。数字营销人员。生物学家。工程师。 现代 CSV 是适用于 Windows、Mac 和 Linux 的功能强大的表格…

SSM 如何使用 TCC 机制实现分布式事务?

SSM 如何使用 TCC 机制实现分布式事务&#xff1f; 分布式事务是现代分布式系统中必不可少的一部分&#xff0c;而 TCC 机制&#xff08;Try-Confirm-Cancel&#xff09;是一种常用的分布式事务处理方式。在 SSM 框架中&#xff0c;我们可以使用 TCC 机制来管理分布式事务。本…

RabbitMQ系列-概念及安装

1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收&#xff0c;使得进程间能相互通信&#xff0c;是点对点的通信 而消息代理是对消息队列的扩展&#xff0c;支持对消息的路由&#xff0c;是发布-订阅模式的通信&#xff0c;消息的发送者并不清楚消息的…

Spring源码解析

Idea导入Spring源码 下载 下载gradle 因为Spring源码里没有使用Maven依赖&#xff0c;而是使用gradle依赖&#xff0c;所以我们需要在本地下载安装并配置gradle环境。注意&#xff0c;这里下载安装的gradle版本应与Spring源码中的gradle版本对应。这里推荐下载我的&#xff…

Linux网络服务:部署YUM仓库与NFS服务

目录 一、理论 1.部署YUM仓库服务 2.NFS共享存储服务 二、实验 1.通过httpd服务建立yum仓库 2.通过vsftpd服务建立yum仓库 3.搭建NFS实现2台或3台服务器共享一个目录 一、理论 1.部署YUM仓库服务 (1) YUM简介 YUM的前身是YUP&#xff0c;借助于YUM软件仓库&#xff0c…

关于原型链

1-__proto__([[Prototype]])和prototype 每个对象都有一个隐式原型&#xff0c;这个隐式原型可以通过 obj.__proto__ Object.getPrototypeOf(obj)这两种方式获取&#xff1b; 我们都知道对象是通过构造函数构造的&#xff0c;new关键字构造的&#xff0c; 构造函数上有一个显…

如何在华为OD机试中获得满分?Java实现【最佳对手】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 游戏里面,队伍通过匹配…

native层函数没有导出时,如何获得相应函数地址?

前言 每次App重新运行后native函数加载的绝对地址是会变化的&#xff0c;唯一不变的是函数相对于基地址的偏移&#xff0c;因此我们可以在获取模块的基地址后加上固定的偏移地址获取相应函数的地址&#xff0c;Frida中也正好提供了这种方式&#xff1a;先通过Module.findBaseA…

SQL教程1

SQL 是用于访问和处理数据库的标准的计算机语言。 在本教程中&#xff0c;您将学到如何使用 SQL 访问和处理数据系统中的数据&#xff0c;这类数据库包括&#xff1a;MySQL、SQL Server、Access、Oracle、Sybase、DB2 等等。 SQL 简介 SQL (Structured Query Language:结构化…

OSPF协议

OSPF&#xff1a;开放式最短路径优先协议 无类别IGP协议&#xff1b;链路状态型&#xff1b;基于LSA收敛&#xff0c;故更新量较大&#xff0c;为在中大型网络正常工作&#xff0c;需要进行结构化的部署 --- 区域划分、ip地址规划 组播更新 --- 224.0.0.5 224.0.0.6 支持等开销…

shell变量的使用 rhce(25)

目录 1.总结变量的类型及含义&#xff1f; 2.实现课堂案例计算长方形面积&#xff1f;&#xff08;6种方式&#xff09; 3.定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/103568815&#xff08;通过多种方法实现&#xff09; &#xff08;1&#xff0…

Redis的数据过期策略

数据淘汰策略-使用建议 1.优先使用allkeys-lru策略。充分利用LRU算法的优势&#xff0c;把最近最常访问的数据留在缓存中。如果业务有明显的冷热数据区分&#xff0c;建议使用。 2.如果业务中数据访问频率差别不大&#xff0c;没有明显冷热数据区分&#xff0c;建议使用allkeys…

【AUTOSAR】 AUTOSAR整体开发流程(六)---- ISOLAR与Simuink

ISOLAR与Simuink交互 8.1 AutoSar的几种开发流程 8.2 Simulink 到ISOLAR Simulink生成SWC arxml SWC arxml放到ISOLAR文件夹 F5即可显示 8.3 ISOLAR到Simulink 1、Matlab的几个命令 1&#xff09;importer Call the constructor arxml.importer to create an importer obj…