Micrometer Tracing和Zipkin实现链路追踪

一、为什么使用链路追踪

在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。

出现问题:

  • 微服务之间的调用错综复杂,用户发送的请求经历哪些服务,调用链不清楚,没有一个自动化的工具类来维护调用链。

  • 无法快速定位调用链中哪个环节出了问题

  • 无法快速定位调用链中哪个环节比较耗时

链路追踪是分布式系统下的一个概念,它的目的就是要解决上面所提出的问题,也就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如,各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

它主要的作用如下:

  • 自动采取数据

  • 分析数据,产生完整调用链:有了请求的完整调用链,问题有很大概率可复现

  • 数据可视化:每个组件的性能可视化,能帮助我们很好地定位系统的瓶颈,及时找出问题所在

通过分布式追踪系统,我们能很好地定位请求的每条具体请求链路,从而轻易地实现请求链路追踪,进而定位和分析每个模块的性能瓶颈。

1、链路追踪原理

分布式链路的数据模型有以下几个:

  • traceID:单个完整链路的唯一 id,客户端请求微服务1,微服务1请求微服务2拥有同一个traceID

  • spanID:每一个请求链路的id,客户端请求微服务1,微服务1请求微服务2都会有一个spanID

  • parentID:接收到的请求来源id,客户端请求微服务1,则微服务1的parentID是客户端id,客户端的parentID为null
    在这里插入图片描述

上图中

service1接受到网页的请求,traceId=x,spanId=null,parentId=null;
service2接受到service1请求,traceId=x,spanId=B,parentId=service1;
service3接受到service2请求,traceId=x,spanId=C,parentId=service2;

2、Sleuth(弃用了解)

Sleuth 是一个基于 Spring Cloud 的分布式跟踪系统,主要用来解决微服务架构中的分布式链路追踪问题,在分布式系统中,请求往往需要涉及多个服务之间的调用,这时候就需要一种工具来帮助我们进行跟踪和监控。Sleuth 就是这样一种工具,它可以记录下请求在分布式系统中的完整流程,从而方便开发人员进行问题定位和排除。

Sleuth 的工作原理很简单:在服务请求发送过程中,Sleuth 首先会为请求生成一个 Trace ID,Trace ID 是一串唯一标识符,用于唯一标识这个请求,然后在请求的头信息中添加 Trace ID 和 Span ID ,最后将请求发送到相应的服务端。当服务端收到请求后,在请求头信息中取出 Trace ID 和 Span ID,根据这些信息,Sleuth 可以将整个分布式系统中的请求流程记录下来。

Spring Cloud Sleuth不适用于Spring Boot3x及以版本。Sleuth支持的最后一个Spring Boot主要版本是2×。

3、Micrometer Tracing和Zipkin

  • Micrometer Tracing

    Micrometer Tracing是一个基于度量库Micrometer的模块,用于在分布式系统中跟踪请求的流转,并收集相关的性能度量数据。
    Micrometer Tracing提供了与各种分布式跟踪工具(如Brave、Zipkin和Jaeger等)的集成,以帮助用户实现跨服务的请求跟踪和性
    能监控。
    Micrometer Tracing使用的跟踪数据格式通常是OpenTracing和OpenTelemetry格式,这些格式提供了跟踪数据的标准表示方法和
    传递协议,以便于不同的跟踪工具之间的互操作性。

    在Micrometer Tracing中,每个请求都被赋予一个唯一的跟踪ID,跟踪ID会被传递到所有服务和组件中,以便将整个请求路径的类
    据聚合在一起,并可视化其性能瓶颈。Micrometer Tracing还可以为每个请求收集各种度量数据,如请求的持续时间、调用服务的
    数量、请求成功或失败的次数等。

  • Zipkin

    Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。

    ZipKin是一个独立的服务程序,只需要在服务器上安装即可

简单来说Micrometer是用来上传服务的信息,而Zipkin是用界面来显示服务的链路信息

二、SpringCloud整合Micrometer Tracing

注意:所有的服务都要配置

  • 添加依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
        <properties>
            <java.version>17</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <spring-boot.version>3.0.2</spring-boot.version>
            <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
            <spring-cloud.version>2022.0.0</spring-cloud.version>
            <!--链路追踪版本-->
            <micrometer-tracing.version>1.0.4</micrometer-tracing.version>
        </properties>
        
        <dependencies>
            <!--链路追踪相关-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-observation</artifactId>
            </dependency>
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing-bridge-brave</artifactId>
            </dependency>
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-reporter-brave</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-micrometer</artifactId>
                <version>12.3</version>
            </dependency>
        </dependencies>
        
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>io.micrometer</groupId>
                    <artifactId>micrometer-tracing-bom</artifactId>
                    <version>${micrometer-tracing.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    </project>
    

    依赖说明:

    • micrometer-observation:一个基于度量库 Micrometer 的观测模块,用于收集应用程序的度量数据。
    • micrometer-tracing-bridge-brave:一个 Micrometer 模块,用于与分布式跟踪工具 Brave 集成,以收集应用程序的分布式跟踪数据。
      • Brave是一个开源的分布式跟踪工具,它可以帮助用户在分布式系统中跟踪请求的流转。Brave使用一种称为“跟踪上下文”的机制,将请求的跟踪信息存储在请求的头部,然后将请求传递给下一个服务。在整个请求链中,Brave会将每个服务处理请求的时间和其他信息存储到跟踪数据中,以便用户可以了解整个请求的路径和性能。
    • zipkin-reporter-brave:一个用于将 Brave 跟踪数据报告到 Zipkin 跟踪系统的库
    • spring-boot-starter-actuator:Spring Boot 框架的一个模块,用于监视和管理应用程序。
    • feign-micrometer:一个 Feign HTTP 客户端的 Micrometer 模块,用于收集客户端请求的度量数据。
  • 修改yml

    #链路追踪配置
    management:
        zipkin:
            tracing:
                endpoint: http://192.172.0.14:9411/api/v2/spans #zipkin服务器地址
        tracing:
            sampling:
                probability: 1.0 # 采样率,0.1表示10次采样1次
    
  • 17
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我理解你的问题是关于在Spring Boot 3中使用Micrometer Tracing Bridge Brave进行RabbitMQ链路追踪时遇到的问题。 首先,你需要在你的项目中添加以下依赖: ```xml <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-core</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-zipkin</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-brave</artifactId> </dependency> ``` 然后,在你的配置文件中,你需要启用MicrometerZipkin: ``` management.metrics.export.zipkin.enabled=true management.metrics.export.zipkin.uri=http://localhost:9411 ``` 接下来,你需要配置RabbitMQ,以便将跟踪信息添加到消息头中: ``` @Bean public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Tracer tracer) { RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setBeforePublishPostProcessors(message -> { Span span = tracer.currentSpan(); if (span != null) { message.getMessageProperties().setHeader("X-B3-TraceId", span.context().traceIdString()); message.getMessageProperties().setHeader("X-B3-SpanId", span.context().spanIdString()); } return message; }); return rabbitTemplate; } ``` 最后,你需要在你的应用程序中创建一个跨度: ```java @Autowired private Tracer tracer; public void sendMessage() { Span span = tracer.nextSpan().name("sendMessage").start(); try (Tracer.SpanInScope ws = tracer.withSpan(span)) { // 发送消息 } finally { span.finish(); } } ``` 如果你的链路追踪仍然无效,可能是因为你的RabbitMQ配置不正确或你的Zipkin服务器没有启动。你可以使用Zipkin UI查看跟踪信息,或者使用Zipkin API查询跟踪信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值