Spring Cloud Sleuth介绍以及简单示例

什么是Spring Cloud Sleuth

Spring Cloud Sleuth是一个分布式追踪系统,用于在分布式系统中跟踪和解决请求的性能问题。它提供了一套API和工具,帮助开发人员在微服务架构中跟踪请求的流程,并可以追踪请求在不同微服务之间的传递。

Spring Cloud Sleuth通过在请求的不同环节中添加唯一的标识符,称为Trace ID和Span ID,来追踪请求的路径和性能。Trace ID是整个请求的唯一标识符,Span ID是每个环节中的唯一标识符。通过这些标识符,开发人员可以分析请求的流程和性能瓶颈,并进行优化。

Spring Cloud Sleuth的底层使用和实现原理

Spring Cloud Sleuth底层使用了AspectJ和AOP(面向切面编程)技术来实现请求的追踪。它通过切面注入,在请求的不同环节中自动创建和传递Trace ID和Span ID,实现请求的跟踪和追踪。它还利用了Spring Cloud的其他组件,如Spring Cloud Config和Spring Cloud Eureka,来实现微服务之间的协同工作。

底层实现原理如下:

  1. 在请求进入微服务的入口处,通过AspectJ注入代码,创建一个唯一的Trace ID,并将其存储在请求的Header中。
  2. 在请求的不同环节中,通过AspectJ注入代码,创建一个唯一的Span ID,并将其存储在请求的Header中。
  3. 在微服务之间进行调用时,将Trace ID和Span ID传递给下一个微服务,并在下一个微服务中创建新的Span ID。
  4. 在请求离开微服务的出口处,通过AspectJ注入代码,记录请求的性能信息,并将Trace ID和Span ID传递给下一个微服务或调用方。
  5. 在调用方接收到响应后,通过AspectJ注入代码,记录响应的性能信息,并将Trace ID和Span ID传递给下一个微服务或调用方。

如何使用Spring Cloud Sleuth

使用Spring Cloud Sleuth非常简单,只需要在项目中添加相应的依赖,并在配置文件中配置相关参数即可。

添加依赖

首先,在pom.xml文件中添加以下依赖:

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

添加配置

然后,在配置文件中添加以下配置:

spring:
  sleuth:
    enabled: true

配置完成后,Spring Cloud Sleuth会自动为每个请求生成唯一的Trace ID和Span ID,并在请求的不同环节中自动传递。

注意事项

使用Spring Cloud Sleuth时,需要注意以下几点:

  1. 确保所有微服务都添加了Spring Cloud Sleuth的依赖,并配置了相同的Trace ID和Span ID。
  2. 需要注意微服务之间的调用关系,确保在调用方将Trace ID和Span ID传递给被调用方,并在被调用方正确接收和处理这些信息。
  3. 需要适当地配置日志输出,以便在日志中查看请求的Trace ID和Span ID,以及相关的性能信息。
  4. 如果需要自定义Trace ID和Span ID的生成方式,可以实现自定义的Trace和Span生成器,并在配置文件中配置使用自定义生成器。

Spring Cloud Sleuth的高级用法

除了基本的请求追踪功能,Spring Cloud Sleuth还提供了一些高级用法,以满足不同的需求。 如设置采样率、设置日志格式等。可以通过配置文件或编程方式进行配置。

采样率设置

通过设置采样率,可以控制哪些请求需要进行追踪。可以配置全局的采样率,也可以为特定的请求设置不同的采样率。

spring:
  sleuth:
    sampler:
      probability: 0.5

日志格式设置

可以配置请求追踪信息的日志格式,以便更好地查看和分析。可以选择使用简单格式或详细格式。

spring:
  sleuth:
    log:
      slf4j:
        format: %X{X-B3-TraceId} %X{X-B3-SpanId} [%X{X-Span-Export}]

自定义Trace和Span生成器

可以实现自定义的Trace和Span生成器,以满足特定的需求。

@Configuration
public class MySleuthConfig {

    @Bean
    public Sampler defaultSampler() {
        return Sampler.ALWAYS_SAMPLE;
    }

    @Bean
    public TraceIdGenerator traceIdGenerator() {
        return new MyTraceIdGenerator();
    }

    @Bean
    public SpanIdGenerator spanIdGenerator() {
        return new MySpanIdGenerator();
    }
}

配置Span收集器

可以配置将Span信息发送到特定的收集器,以便进行分析和展示。可以选择使用Zipkin等分布式追踪系统作为收集器。

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

通过以上高级用法,开发人员可以根据实际需求,灵活地配置和使用Spring Cloud Sleuth。

简单实现

下面是一个示例代码,演示了如何使用Spring Cloud Sleuth来追踪请求。

controller层

我们创建了一个HelloController,其中包含了两个接口:/hello和/hello-chain。/hello接口直接返回字符串,而/hello-chain接口调用了另一个微服务的/hello接口,并将其返回值作为响应返回。

@RestController
public class HelloController {

    private static final Logger LOGGER = LoggerFactory.getLogger(HelloController.class);

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/hello")
    public String hello() {
        LOGGER.info("HelloController: hello");
        return "Hello from HelloController";
    }

    @GetMapping("/hello-chain")
    public String helloChain() {
        LOGGER.info("HelloController: helloChain");
        String response = restTemplate.getForObject("http://localhost:8081/hello", String.class);
        return "Hello from HelloController, response: " + response;
    }
}

启动类

我们在Application类上添加了@EnableEurekaClient和@EnableFeignClients注解,以启用Eureka客户端和Feign客户端。

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

配置类

在MySleuthConfig类中,我们实现了自定义的Trace和Span生成器,并通过@Bean注解将它们添加到Spring容器中。

@Configuration
public class MySleuthConfig {

    @Bean
    public Sampler defaultSampler() {
        return Sampler.ALWAYS_SAMPLE;
    }

    @Bean
    public TraceIdGenerator traceIdGenerator() {
        return new MyTraceIdGenerator();
    }

    @Bean
    public SpanIdGenerator spanIdGenerator() {
        return new MySpanIdGenerator();
    }
}

自定义逻辑生成类

@Component
public class MyTraceIdGenerator implements TraceIdGenerator {

    @Override
    public String generateTraceId() {
        // 自定义Trace ID生成逻辑
        return "my-trace-id";
    }
}

@Component
public class MySpanIdGenerator implements SpanIdGenerator {

    @Override
    public String generateSpanId() {
        // 自定义Span ID生成逻辑
        return "my-span-id";
    }
}

通过以上示例代码,我们可以使用Spring Cloud Sleuth来追踪请求,在分布式系统中进行性能分析和优化。

总结

文章内容较多,但具体并不复杂,希望以上内容对您有帮助!

参考文献

  1. Spring Cloud Sleuth官方文档:这是Spring Cloud Sleuth的官方文档,包含了详细的使用指南、配置说明和示例代码。

  2. Spring Cloud Sleuth GitHub仓库:这是Spring Cloud Sleuth的GitHub仓库,您可以在此处找到源代码、发布版本和问题跟踪。

  3. Spring Cloud Sleuth示例应用:这是一个包含了多个使用Spring Cloud Sleuth的示例应用的GitHub仓库,您可以参考这些示例来学习如何在不同场景下使用Spring Cloud Sleuth。

  4. Spring Cloud Sleuth视频教程:这是一系列关于Spring Cloud Sleuth的视频教程,涵盖了基本概念、使用方法和实际应用场景。

  5. Spring Cloud Sleuth博客文章:这是Spring官方博客中关于Spring Cloud Sleuth的一些文章,包含了一些实用的技巧和最佳实践。

大家是否遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言!

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
# Spring Cloud Examples Spring Cloud 使用的各种示例,以最简单、最实用为标准 [Spring Cloud 中文索引](https://github.com/ityouknow/awesome-spring-cloud)  |   [Spring Boot学习示例代码](https://github.com/ityouknow/spring-boot-examples)  |   [参与贡献](https://github.com/ityouknow/spring-cloud-examples/issues) [English](README_EN.md)  |   **[github地址](https://github.com/ityouknow/spring-cloud-examples)**  |   **[码云地址](https://gitee.com/ityouknow/spring-cloud-examples)** Spring Cloud 使用的各种示例,以最简单、最实用为标准 **[Spring Boot 2.0 最全使用教程](https://github.com/ityouknow/spring-boot-leaning)** - [spring-cloud-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-eureka):eureka server单机、双机、集群示例 - [eureka-producer-consumer](https://github.com/ityouknow/spring-cloud-examples/tree/master/eureka-producer-consumer):利用eureka实现服务提供与调用示例 - [spring-cloud-hystrix](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-hystrix):Hystrix熔断的使用示例 - [hystrix-dashboard-turbine](https://github.com/ityouknow/spring-cloud-examples/tree/master/hystrix-dashboard-turbine):熔断监控Hystrix Dashboard和Turbine的示例 - [spring-cloud-config-git](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-git):配置中心git版本示例 - [spring-cloud-config-svn-refresh](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-svn-refresh):配置中心svn版本示例,客户端refresh版本示例 - [spring-cloud-config-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-eureka):配置中心服务化和高可用代码示例 - [spring-cloud-config-eureka-bus](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-config-eureka-bus):配置中心和消息总线示例(配置中心终结版) - [gateway-service-zuul](https://github.com/ityouknow/spring-cloud-examples/tree/master/gateway-service-zuul):Spring Cloud Zuul使用初级篇 网关 均衡负载 - [spring-cloud-zuul](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-zuul):Spring Cloud Zuul使用高级篇 Filter 鉴权 熔断 重试 - [spring-cloud-sleuth-zipkin](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-sleuth-zipkin): 利用Sleuth、Zipkin对Spring Cloud应用进行服务追踪分析 - [spring-boot-admin-eureka](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-boot-admin-eureka): 使用Spring Boot Admin 对Spring Cloud集群进行监控示例 - [spring-cloud-consul](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-consul): Spring Cloud 使用 Consul 作为服务中心示例 - [spring-cloud-gateway](https://github.com/ityouknow/spring-cloud-examples/tree/master/spring-cloud-gateway): Spring Cloud 使用 gateway 的相关示例 学习系列: - [springcloud(一):大话Spring Cloud](http://www.ityouknow.com/springcloud/2017/05/01/simple-springcloud.html) - [springcloud(二):注册中心Eureka](http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html) - [springcloud(三):服务提供与调用](http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html) - [springcloud(四):熔断器Hystrix](http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html) - [springcloud(五):熔断监控Hystrix Dashboard和Turbine](http://www.ityouknow.com/springcloud/2017/05/18/hystrix-dashboard-turbine.html) - [springcloud(六):配置中心git示例](http://www.ityouknow.com/springcloud/2017/05/22/springcloud-config-git.html) - [springcloud(七):配置中心svn示例和refresh](http://www.ityouknow.com/springcloud/2017/05/23/springcloud-config-svn-refresh.html) - [springcloud(八):配置中心服务化和高可用](http://www.ityouknow.com/springcloud/2017/05/25/springcloud-config-eureka.html) - [springcloud(九):配置中心和消息总线(配置中心终结版)](http://www.ityouknow.com/springcloud/2017/05/26/springcloud-config-eureka-bus.html) - [springcloud(十):服务网关zuul](http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html) - [springcloud(十一):服务网关Zuul高级篇](http://www.ityouknow.com/springcloud/2018/01/20/spring-cloud-zuul.html) - [springcloud(十二):使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪](http://www.ityouknow.com/springcloud/2018/02/02/spring-cloud-sleuth-zipkin.html) - [springcloud(十三):Spring Cloud Consul 使用详解](http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html) - [Spring Cloud (十四):Spring Cloud 开源软件都有哪些?](http://www.ityouknow.com/springcloud/2018/08/06/spring-cloud-open-source.html) - [springcloud(十五):服务网关 Spring Cloud GateWay 初级篇](http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html) - [springcloud(十六):服务网关 Spring Cloud GateWay 服务化和过滤器](http://www.ityouknow.com/springcloud/2019/01/19/spring-cloud-gateway-service.html) - [springcloud(十七):服务网关 Spring Cloud GateWay 熔断、限流、重试](http://www.ityouknow.com/springcloud/2019/01/26/spring-cloud-gateway-limit.html) 综合篇: - **[Spring Cloud在国内中小型公司能用起来吗?](http://www.ityouknow.com/springcloud/2017/09/11/can-use-springcloud.html)** - **[中小型互联网公司微服务实践-经验和教训](http://www.ityouknow.com/springcloud/2017/10/19/micro-service-practice.html)** - **[从架构演进的角度聊聊Spring Cloud都做了些什么?](http://www.ityouknow.com/springcloud/2017/11/02/framework-and-springcloud.html)**

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘刘刘刘刘先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值