【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识

简介: 【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识

🐳Spring Cloud Sleuth 分布式链路跟踪

在微服务架构中,系统由多个服务组成,服务之间的调用关系错综复杂。当一个请求从一个服务发起并经过多个服务调用时,排查问题和分析性能瓶颈变得非常困难。为了解决这个问题,Spring Cloud Sleuth 提供了一种分布式链路跟踪的解决方案。本文将介绍 Spring Cloud Sleuth 的概念和用法,并通过一个案例来说明如何搭建链路监控。


Spring Cloud Sleuth 概述

为什么需要分布式链路跟踪?

 💧在微服务架构中,一个用户请求往往需要经过多个服务的调用才能完成。当请求出现问题或者需要排查性能问题时,我们需要追踪整个请求的路径,并找到请求的每个阶段所消耗的时间。这就是分布式链路跟踪的作用,它能够帮助我们快速定位问题,并进行性能分析。

Spring Cloud Sleuth 是什么?

 💧Spring Cloud Sleuth 是 Spring Cloud 生态系统中的一个组件,用于实现分布式系统的请求跟踪。它基于 Google 的开源项目 Dapper 实现,并集成了 Zipkin 分布式跟踪系统。Spring Cloud Sleuth 提供了一套标准化的解决方案,通过在请求中添加唯一的标识符和跟踪信息,实现了整个分布式系统的链路追踪和性能分析。

Spring Cloud Sleuth 能解决什么问题?

  • 请求追踪:Spring Cloud Sleuth 为每个请求生成唯一的跟踪标识符,并在请求的每个阶段添加跟踪信息。这使得我们能够准确追踪请求经过的每个服务和调用路径。
  • 性能分析:通过收集和聚合跟踪信息,Spring Cloud Sleuth 可以提供性能分析功能。我们可以了解每个请求的处理时间和耗时情况,识别性能瓶颈并进行优化。
  • 故障排查:当一个请求出现问题时,我们可以通过分析跟踪信息来定位问题。Spring Cloud Sleuth 提供了请求的完整调用链,可以帮助我们快速定位故障点并进行排查。

 💧现在,让我们一步一步搭建链路监控,并使用 Docker 启动 Zipkin 作为跟踪系统 ↓

搭建链路监控步骤

1. Zipkin 的介绍与安装

Zipkin 是什么?

Zipkin 是一个分布式跟踪系统,用于收集、存储和展示分布式系统中的跟踪数据。它提供了一个用户友好的界面,用于可视化分析请求的调用链路和性能指标。

安装 Zipkin

 💧首先,我们需要使用 Docker 安装和运行 Zipkin。确保你已经安装了 Docker。

 💧在终端或命令行中执行以下命令来下载并运行 Zipkin 容器:

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

 💧这将下载并运行 Zipkin 容器,并将容器的 9411 端口映射到本地的 9411 端口。

2. 服务提供者

 💧我们将创建一个简单的 Spring Boot 服务作为示例的服务提供者。首先,创建一个新的 Spring Boot 项目,添加以下依赖:

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

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

spring.application.name=service-provider

 💧创建一个 REST Controller 类,用于处理请求:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

 💧在启动类上添加 @EnableZipkinServer 注解,以启用 Zipkin 客户端:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.internal.EnableZipkinServer;
@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}

3. 服务消费者

接下来,我们创建一个使用服务提供者的服务消费者。创建一个新的 Spring Boot 项目,添加以下依赖:

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

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

spring.application.name=service-consumer
spring.zipkin.base-url=http://localhost:9411

创建一个 REST Controller 类,用于向服务提供者发送请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
    @Autowired
 private Tracer tracer;
    @GetMapping("/consume")
    public String consume() {
        // 创建 RestTemplate 对象
        RestTemplate restTemplate = new RestTemplate();
        // 发送请求
        ResponseEntity<String> response = restTemplate.getForEntity("http://localhost:8080/hello", String.class);
        // 输出响应结果
        String result = response.getBody();
        // 打印当前跟踪信息
        System.out.println("TraceId: " + tracer.currentSpan().context().traceId());
        return result;
    }
}

在启动类上添加 @EnableZipkinServer 注解,以启用 Zipkin 客户端:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.internal.EnableZipkinServer;
@SpringBootApplication
@EnableZipkinServer
public class ZipkinServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZipkinServerApplication.class, args);
    }
}

4. 启动服务并进行访问

 💧首先,启动服务提供者和服务消费者的应用程序。确保两个应用程序都成功启动。

 💧然后,使用浏览器或者 API 工具访问服务消费者的 /consume 路径,例如:http://localhost:8081/consume。

 💧在 Zipkin 界面中,你应该可以看到请求的跟踪信息和调用链路。


总结

通过 Spring Cloud Sleuth 和 Zipkin,我们可以方便地实现分布式系统的链路跟踪和性能分析。本文介绍了 Spring Cloud Sleuth 的概念和用法,并通过一个案例演示了如何搭建链路监控。我们通过 Docker 安装了 Zipkin,并创建了一个简单的服务提供者和消费者。最后,我们使用 Zipkin 来查看请求的跟踪信息和调用链路。

相关文章
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
126 1
|
1月前
|
人工智能 文字识别 Java
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
尼恩,一位拥有20年架构经验的老架构师,通过其深厚的架构功力,成功指导了一位9年经验的网易工程师转型为大模型架构师,薪资逆涨50%,年薪近80W。尼恩的指导不仅帮助这位工程师在一年内成为大模型架构师,还让他管理起了10人团队,产品成功应用于多家大中型企业。尼恩因此决定编写《LLM大模型学习圣经》系列,帮助更多人掌握大模型架构,实现职业跃迁。该系列包括《从0到1吃透Transformer技术底座》、《从0到1精通RAG架构》等,旨在系统化、体系化地讲解大模型技术,助力读者实现“offer直提”。此外,尼恩还分享了多个技术圣经,如《NIO圣经》、《Docker圣经》等,帮助读者深入理解核心技术。
SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?
|
2月前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
2月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
44 1
|
2月前
|
消息中间件 Java 对象存储
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
数据一致性挑战:Spring Cloud与Netflix OSS下的分布式事务管理
52 2
|
3月前
|
监控 Java 应用服务中间件
分布式链路监控系统问题之Eagleeye的traceId设计的问题如何解决
分布式链路监控系统问题之Eagleeye的traceId设计的问题如何解决
|
3月前
|
监控 API 开发者
分布式链路监控系统问题之ASM的开发体验被认为是噩梦般的问题如何解决
分布式链路监控系统问题之ASM的开发体验被认为是噩梦般的问题如何解决
|
3月前
|
监控 Java API
分布式链路监控系统问题之对Java应用实现字节码增强的方式的问题如何解决
分布式链路监控系统问题之对Java应用实现字节码增强的方式的问题如何解决
|
3月前
|
监控 中间件
分布式链路监控系统问题之当某个Segment数据缺失时还原调用树的问题如何解决
分布式链路监控系统问题之当某个Segment数据缺失时还原调用树的问题如何解决