Spring Boot 中的分布式追踪

简介: Spring Boot 中的分布式追踪

Spring Boot 中的分布式追踪


引言


在分布式系统中,由于系统架构的复杂性和分布式环境的异构性,很难对整个系统的运行状态进行全面的监控和管理。为了解决这个问题,我们需要引入分布式追踪技术。分布式追踪可以帮助我们对分布式系统中的各个组件进行追踪和监控,以便快速地定位和解决问题。


在 Spring Boot 中,我们可以使用 Spring Cloud Sleuth 来实现分布式追踪。Spring Cloud Sleuth 是 Spring Cloud 的一个子项目,它提供了分布式追踪的功能,并集成了 Zipkin 和其他追踪系统。


195340b5964c957dfb5ee21d004292d0_7af884d1998044b8895c837601258017.png


Spring Cloud Sleuth 的架构


Spring Cloud Sleuth 的架构如下图所示:


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


在上图中,我们可以看到 Spring Cloud Sleuth 的架构包括了以下几个组件:


  • Trace:表示一次分布式追踪过程,包含了一组 Span。
  • Span:表示一个基本的工作单元,包含了一组 Annotations 和 Tags。
  • Annotations:表示 Span 的事件,比如 client send、server receive 等。
  • Tags:表示 Span 的属性,比如 URL、HTTP 方法、响应码等。
  • Tracer:表示追踪器,用于创建和管理 Trace 和 Span。
  • SpanExporter:表示 Span 的导出器,用于将 Span 导出到追踪系统中。


Spring Cloud Sleuth 的核心是 Trace 和 Span,它们用于描述一个分布式追踪过程。通过 Annotations 和 Tags,我们可以获得更详细的追踪信息。Tracer 则用于创建和管理 Trace 和 Span,SpanExporter 则用于将 Span 导出到追踪系统中。


使用 Spring Cloud Sleuth


在 Spring Boot 中,我们可以使用 Spring Cloud Sleuth 来实现分布式追踪。以下是一个简单的 Spring Boot 应用程序:


@SpringBootApplication
@RestController
public class Application {
    private static final Logger logger = LoggerFactory.getLogger(Application.class);
    @Autowired
    private RestTemplate restTemplate;
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @GetMapping("/hello")
    public String hello() {
        logger.info("hello 方法被调用了!");
        String response = restTemplate.getForObject("http://localhost:8080/greeting", String.class);
        return "Hello, World: " + response;
    }
    @GetMapping("/greeting")
    public String greeting() {
        logger.info("greeting 方法被调用了!");
        return "Greetings from Spring Boot!";
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在上面的代码中,我们创建了一个 Spring Boot 应用程序,并提供了两个接口:/hello 和 /greeting。在 /hello 接口中,我们使用 RestTemplate 来调用 /greeting 接口,并返回响应结果。


为了实现分布式追踪,我们需要引入 Spring Cloud Sleuth 的依赖:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

在引入依赖后,我们可以在应用程序中使用 Trace 和 Span 来追踪请求的过程。以下是修改后的代码:


@SpringBootApplication
@RestController
public class Application {
    private static final Logger logger = LoggerFactory.getLogger(Application.class);
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private Tracer tracer;
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @GetMapping("/hello")
    public String hello() {
        logger.info("hello 方法被调用了!");
        Span span = tracer.nextSpan().name("rest").start();
        try (Tracer.SpanInScope ws = tracer.withSpan(span.start())) {
            String response = restTemplate.getForObject("http://localhost:8080/greeting", String.class);
            return "Hello, World: " + response;
        } finally {
            span.finish();
        }
    }
    @GetMapping("/greeting")
    public String greeting() {
        logger.info("greeting 方法被调用了!");
        return "Greetings from Spring Boot!";
    }
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

在上面的代码中,我们使用 @Autowired 注解将 Tracer 注入到应用程序中。在 /hello 接口中,我们使用 Tracer 创建了一个 Span,并在请求 /greeting 接口时将 Span 传递给 RestTemplate。在请求结束后,我们使用 Span 的 finish 方法来结束这个 Span。这样,我们就可以在 Zipkin 中查看到请求的追踪信息。


Zipkin 的安装和配置


要使用 Spring Cloud Sleuth 和 Zipkin,我们需要安装和配置 Zipkin。Zipkin 是一个用于分布式追踪的开源工具,可以用于收集、存储和展示分布式追踪信息。以下是 Zipkin 的安装和配置步骤:


1.下载 Zipkin Server

可以从 Zipkin 的官网下载最新版本的 Zipkin Server(https://zipkin.io/pages/quickstart.html)。下载完成后,解压缩文件。


2.启动 Zipkin Server

在解压缩后的目录下,执行以下命令启动 Zipkin Server:


java -jar zipkin.jar


Zipkin Server 将默认启动在 9411 端口。


修改 Spring Boot 应用程序的配置

在 Spring Boot 应用程序中,我们需要修改配置文件来将追踪信息发送到 Zipkin。以下是一个简单的配置文件:


spring:
  application:
    name: demo
  sleuth:
    sampler:
      probability: 1.0
  zipkin:
    base-url: http://localhost:9411/

在上面的配置文件中,我们使用 spring.application.name 属性来指定应用程序的名称。sleuth.sampler.probability 属性用于指定采样率,如果值为 1.0,则表示所有请求都会被采样。zipkin.base-url 属性用于指定 Zipkin Server 的地址。


查看追踪信息


在配置完成后,我们可以在 Zipkin 中查看分布式追踪信息。在浏览器中打开 Zipkin 的地址(默认为 http://localhost:9411/),可以看到 Zipkin 的界面。在界面上方的搜索框中输入应用程序的名称,就可以查看该应用程序的追踪信息。


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


在上图中,我们可以看到 /hello 接口的追踪信息,包括 Span 的名称、开始时间、结束时间、耗时、Annotations 和 Tags 等信息。通过这些信息,我们可以了解请求的整个过程,包括请求的来源、目标、响应时间、HTTP 方法、URL 等信息。


总结


在本文中,我们介绍了 Spring Cloud Sleuth 和 Zipkin,以及如何在 Spring Boot 中使用它们来实现分布式追踪。我们创建了一个简单的 Spring Boot 应用程序,并使用 Tracer 和 Span 来追踪请求的过程。我们还介绍了 Zipkin 的安装和配置方法,以及如何在 Zipkin 中查看追踪信息。Spring Cloud Sleuth 和 Zipkin 是非常强大的分布式追踪工具,可以帮助我们快速地定位和解决问题。


相关文章
|
2月前
|
人工智能 Java Nacos
基于 Spring AI Alibaba + Nacos 的分布式 Multi-Agent 构建指南
本文将针对 Spring AI Alibaba + Nacos 的分布式多智能体构建方案展开介绍,同时结合 Demo 说明快速开发方法与实际效果。
1846 60
|
3月前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
732 3
|
2月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
3月前
|
NoSQL Java 调度
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
分布式锁是分布式系统中用于同步多节点访问共享资源的机制,防止并发操作带来的冲突。本文介绍了基于Spring Boot和Redis实现分布式锁的技术方案,涵盖锁的获取与释放、Redis配置、服务调度及多实例运行等内容,通过Docker Compose搭建环境,验证了锁的有效性与互斥特性。
220 0
分布式锁与分布式锁使用 Redis 和 Spring Boot 进行调度锁(不带 ShedLock)
|
7月前
|
人工智能 负载均衡 Java
Spring AI Alibaba 发布企业级 MCP 分布式部署方案
本文介绍了Spring AI Alibaba MCP的开发与应用,旨在解决企业级AI Agent在分布式环境下的部署和动态更新问题。通过集成Nacos,Spring AI Alibaba实现了流量负载均衡及节点变更动态感知等功能。开发者可方便地将企业内部业务系统发布为MCP服务或开发自己的AI Agent。文章详细描述了如何通过代理应用接入存量业务系统,以及全新MCP服务的开发流程,并提供了完整的配置示例和源码链接。未来,Spring AI Alibaba计划结合Nacos3的mcp-registry与mcp-router能力,进一步优化Agent开发体验。
2513 14
|
7月前
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
676 4
|
10月前
|
NoSQL Java Redis
Springboot使用Redis实现分布式锁
通过这些步骤和示例,您可以系统地了解如何在Spring Boot中使用Redis实现分布式锁,并在实际项目中应用。希望这些内容对您的学习和工作有所帮助。
956 83
|
9月前
|
存储 Java 文件存储
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
本文介绍了如何基于Spring Boot 3和MinIO实现分布式文件存储。随着应用规模扩大,传统的单机文件存储方案难以应对大规模数据和高并发访问,分布式文件存储系统成为更好的选择。文章详细讲解了MinIO的安装、配置及与Spring Boot的整合步骤,包括Docker部署、MinIO控制台操作、Spring Boot项目中的依赖引入、配置类编写及工具类封装等内容。最后通过一个上传头像的接口示例展示了具体的开发和测试过程,强调了将API操作封装成通用工具类以提高代码复用性和可维护性的重要性。
1936 7
🗄️Spring Boot 3 整合 MinIO 实现分布式文件存储
|
10月前
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
2441 45

热门文章

最新文章