首页 > 其他分享 >使用Spring Cloud Sleuth实现分布式系统的链路追踪

使用Spring Cloud Sleuth实现分布式系统的链路追踪

时间:2024-07-17 13:52:32浏览次数:7  
标签:Sleuth service Spring 分布式系统 springframework import org cloud 追踪

使用Spring Cloud Sleuth实现分布式系统的链路追踪

大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

一、引言

在微服务架构中,应用程序被分解成多个服务,每个服务都可以独立部署和扩展。这种架构虽然带来了很多好处,但也增加了调试和监控的复杂性。链路追踪(Tracing)是一种用于监控和调试分布式系统的方法。Spring Cloud Sleuth是一个用于实现分布式链路追踪的强大工具。本文将详细介绍如何使用Spring Cloud Sleuth来实现分布式系统的链路追踪。

二、Spring Cloud Sleuth简介

Spring Cloud Sleuth通过在微服务之间传递唯一的追踪ID和Span ID,实现对请求路径的追踪。它集成了Zipkin等开源分布式追踪系统,可以将追踪数据发送到这些系统进行集中展示和分析。

三、环境搭建

在开始编写代码之前,我们需要搭建Spring Cloud Sleuth的运行环境。假设我们有两个微服务:service-aservice-b。我们将在这两个服务中集成Spring Cloud Sleuth。

四、创建Spring Boot项目

首先,我们创建两个Spring Boot项目,分别为service-aservice-b,并添加必要的依赖。

  1. service-a的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-zipkin</artifactId>
    </dependency>
</dependencies>
  1. service-b的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-zipkin</artifactId>
    </dependency>
</dependencies>

五、配置Zipkin

为了收集和展示追踪数据,我们需要配置Zipkin。可以通过Docker来快速启动一个Zipkin实例:

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

六、编写代码

接下来,我们编写代码来实现两个服务的调用和链路追踪。

  1. service-a中的代码
package cn.juwatech.servicea;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.cloud.sleuth.Tracer;

@RestController
public class ServiceAController {

    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private Tracer tracer;

    @GetMapping("/service-a")
    public String callServiceB() {
        tracer.currentSpan().tag("custom-tag", "service-a-call");
        return restTemplate.getForObject("http://localhost:8081/service-b", String.class);
    }
}
  1. service-b中的代码
package cn.juwatech.serviceb;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.cloud.sleuth.Tracer;

@RestController
public class ServiceBController {
    
    @Autowired
    private Tracer tracer;

    @GetMapping("/service-b")
    public String serviceB() {
        tracer.currentSpan().tag("custom-tag", "service-b-response");
        return "Response from Service B";
    }
}
  1. 在两个服务的主类中添加RestTemplate Bean
package cn.juwatech.servicea;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
public class ServiceAApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceAApplication.class, args);
    }

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
package cn.juwatech.serviceb;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ServiceBApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceBApplication.class, args);
    }
}

七、测试链路追踪

启动两个服务,并访问http://localhost:8080/service-a。随后,访问Zipkin UI(默认地址为http://localhost:9411),可以看到请求的追踪信息。

八、配置自定义追踪

为了更好地监控和调试,我们可以添加自定义的追踪信息。例如,添加自定义标签、日志等。

  1. service-aservice-b中添加自定义标签
import org.springframework.cloud.sleuth.Span;
import org.springframework.cloud.sleuth.Tracer;

@Autowired
private Tracer tracer;

public void someMethod() {
    Span newSpan = tracer.nextSpan().name("new-span").start();
    try (Tracer.SpanInScope ws = tracer.withSpan(newSpan.start())) {
        // 自定义逻辑
        newSpan.tag("custom-key", "custom-value");
    } finally {
        newSpan.end();
    }
}

九、总结

通过本文的介绍,我们学习了如何使用Spring Cloud Sleuth来实现分布式系统的链路追踪。通过集成Zipkin,可以方便地收集和展示追踪数据,从而提高系统的可观测性和调试能力。

本文著作权归聚娃科技微赚淘客系统开发者团队,转载请注明出处!

标签:Sleuth,service,Spring,分布式系统,springframework,import,org,cloud,追踪
From: https://www.cnblogs.com/szk123456/p/18307156

相关文章

  • 使用Spring Boot和GraphQL构建灵活的API服务
    使用SpringBoot和GraphQL构建灵活的API服务大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!一、引言在现代Web应用中,API服务是前后端数据交互的桥梁。传统的RESTfulAPI虽然强大,但在复杂查询场景中显得有些笨重。GraphQL作为一种新型API查询语言,提供了......
  • Spring Boot 开启事务支持详细总结
    Spring对事务的支持        Spring支持两种事务方式,分别是编程式事务和声明式事务,后者最常见,通常情况下只需要一个 @Transactional 就搞定了(代码侵入性降到了最低),就像这样:@TransactionalpublicvoidsavePosts(PostsParampostsParam){//保存文章save(p......
  • 【2024】springboot Home F家居系统的设计与管理
    博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数......
  • springboot整合第三方框架
    1.整合mybatis引入依赖<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--mysq......
  • spring boot的基础入门
    1.什么是springbootspringboot也是spring公司开发的一款框架。为了简化spring项目的初始化搭建的。spring项目搭建的缺点:[1]配置麻烦[2]依赖[3]tomcat启动慢2.springboot的特点1)自动配置SpringBoot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过......
  • Spring事务原理、Spring事务传播机制
    Spring的@EnableTransactionManagement和@Transactional原理@Configuration@EnableTransactionManagementpublicclassAppConfig{//配置类内容}@ServicepublicclassMyService{@TransactionalpublicvoidprocessPayment(Payment......
  • 面试官:为什么SpringBoot的 jar 可以直接运行?
    引言传统Java应用部署:需要将应用打包成WAR文件,部署到如ApacheTomcat、Jetty等Web容器中。SpringBoot:改变了Java应用的开发体验,应用可以打包成可直接运行的jar文件,无需外部容器。SpringBootJAR包基础概念FatJAR(胖Jar):包含应用程序所需的全部依赖库和应用程序自身的......
  • Java面试 (5) :SSM(Spring框架、Spring MVC、MyBatis…)
    Java面试——SSM基础知识:Spring框架、SpringMVC、MyBatis…文章目录1String框架1.1IOC和DI1.2Bean1.2.1作用域1.2.2自动装配模式1.2.3生命周期1.2.3.1doGetBean()源码1.2.3.2七个阶段详解1.2.4Bean线程安全1.3常用的Spring注解1.4事务1.4.1Spring事务......
  • 基于ssm的springboot摄影约拍系统的设计实现(源码+LW+部署讲解)
    前言......
  • Spring Boot+Redis 分布式锁:模拟抢单
    如何删除锁模拟抢单动作(10w个⼈开抢)jedis的nx⽣成锁对于java中想操作redis,好的⽅式是使⽤jedis,⾸先pom中引⼊依赖:<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>对于分布式锁的⽣成通常......