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


相关文章
|
22天前
|
NoSQL Java 测试技术
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
102 0
|
22天前
|
Dubbo Java 应用服务中间件
Spring Boot Dubbo 构建分布式服务
Spring Boot Dubbo 构建分布式服务
34 0
|
24天前
|
负载均衡 Java 开发者
【分布式】Spring Cloud 组件综述
【1月更文挑战第25天】【分布式】Spring Cloud 组件综述
|
27天前
|
运维 监控 Java
Spring Cloud Alibaba分布式事务问题之事务commit失败如何解决
Spring Cloud Alibaba提供了一套在Spring Cloud框架基础上构建的微服务解决方案,旨在简化分布式系统的开发和管理;本合集将探讨Spring Cloud Alibaba在实际应用中的部署和使用技巧,以及该框架常见问题的诊断方法和解决步骤。
|
17天前
|
存储 数据采集 监控
SkyWalking全景解析:从原理到实现的分布式追踪之旅
SkyWalking全景解析:从原理到实现的分布式追踪之旅
37 1
EMQ
|
1天前
|
存储 NoSQL API
EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
新版本提供 OpenTelemetry 分布式追踪与日志集成功能,新增了开放充电协议 OCPP 协议接入能力,并为数据集成添加了 Confluent 支持。此外,新版本还进行了多项改进以及 BUG 修复,进一步提升了整体性能和稳定性。
EMQ
188 2
EMQX Enterprise 5.4 发布:OpenTelemetry 分布式追踪、OCPP 网关、Confluent 集成支持
|
22天前
|
存储 NoSQL Java
纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式
纠正误区:这才是 SpringBoot Redis 分布式锁的正确实现方式
106 0
|
29天前
|
Dubbo Java 应用服务中间件
Spring Boot + Dubbo + Zookpeer分布式案例
Spring Boot + Dubbo + Zookpeer分布式案例
31 0
|
2月前
|
Java 应用服务中间件 nginx
阿里巴巴架构实战:SpringBoot+SpringCloud+Docker+Nginx+分布式
在过去的几年时间里,最让人兴奋、回头率最高、最能改变游戏规则的东西,大概就是Spring Boot了。Spring Boot提供了一种新的编程范式,能在最小的阻力下开发Spring应用程序。有了它, 你可以更加敏捷地开发Spring应用程序,专注于应用程序的功能,不用在Spring的配置上多花功 夫,甚至完全不用配置。
|
2月前
|
缓存 NoSQL Java
SpringBoot:第五篇 集成Guava(本地缓存+分布式缓存)
SpringBoot:第五篇 集成Guava(本地缓存+分布式缓存)
23 0

相关产品

  • 云迁移中心