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 是非常强大的分布式追踪工具,可以帮助我们快速地定位和解决问题。


相关文章
|
1月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
这篇文章是关于如何在SpringBoot应用中整合Redis并处理分布式场景下的缓存问题,包括缓存穿透、缓存雪崩和缓存击穿。文章详细讨论了在分布式情况下如何添加分布式锁来解决缓存击穿问题,提供了加锁和解锁的实现过程,并展示了使用JMeter进行压力测试来验证锁机制有效性的方法。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解分布式情况下如何添加分布式锁 【续篇】
|
29天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
|
10天前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
49 1
|
1月前
|
缓存 NoSQL Java
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
这篇文章介绍了如何在SpringBoot项目中整合Redis,并探讨了缓存穿透、缓存雪崩和缓存击穿的问题以及解决方法。文章还提供了解决缓存击穿问题的加锁示例代码,包括存在问题和问题解决后的版本,并指出了本地锁在分布式情况下的局限性,引出了分布式锁的概念。
SpringBoot整合Redis、以及缓存穿透、缓存雪崩、缓存击穿的理解、如何添加锁解决缓存击穿问题?分布式情况下如何添加分布式锁
|
1月前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
2月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14608 24
|
1月前
|
Dubbo Java 调度
揭秘!Spring Cloud Alibaba的超级力量——如何轻松驾驭分布式定时任务调度?
【8月更文挑战第20天】在现代微服务架构中,Spring Cloud Alibaba通过集成分布式定时任务调度功能解决了一致性和可靠性挑战。它利用TimerX实现任务的分布式编排与调度,并通过`@SchedulerLock`确保任务不被重复执行。示例代码展示了如何配置定时任务及其分布式锁,以实现每5秒仅由一个节点执行任务,适合构建高可用的微服务系统。
47 0
|
2月前
|
消息中间件 Java 开发者
Spring Cloud微服务框架:构建高可用、分布式系统的现代架构
Spring Cloud是一个开源的微服务框架,旨在帮助开发者快速构建在分布式系统环境中运行的服务。它提供了一系列工具,用于在分布式系统中配置、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话、集群状态等领域的支持。
145 5
|
2月前
|
缓存 NoSQL Java
在Spring Boot中实现分布式缓存策略
在Spring Boot中实现分布式缓存策略
|
24天前
|
NoSQL Redis
基于Redis的高可用分布式锁——RedLock
这篇文章介绍了基于Redis的高可用分布式锁RedLock的概念、工作流程、获取和释放锁的方法,以及RedLock相比单机锁在高可用性上的优势,同时指出了其在某些特殊场景下的不足,并提到了ZooKeeper作为另一种实现分布式锁的方案。
59 2
基于Redis的高可用分布式锁——RedLock