SpringCloud-05-Micrometer Tracing+ZipKin分布式链路追踪

一、Micrometer Tracing概述

1、分布式微服务要解决的问题

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

在分布式与微服务场景下,我们需要解决如下问题:

  • 在大规模分布式与微服务集群下,如何实时观测系统的整体调用链路情况。
  • 在大规模分布式与微服务集群下,如何快速发现并定位到问题。
  • 在大规模分布式与微服务集群下,如何尽可能精确的判断故障对系统的影响范围与影响程度。
  • 在大规模分布式与微服务集群下,如何尽可能精确的梳理出服务之间的依赖关系,并判断出服务之间的依赖关系是否合理。
  • 在大规模分布式与微服务集群下,如何尽可能精确的分析整个系统调用链路的性能与瓶颈点。
  • 在大规模分布式与微服务集群下,如何尽可能精确的分析系统的存储瓶颈与容量规划。

分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。

比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

2、简介

Micrometer Tracing 是 Spring Boot 3.x 内置的分布式追踪解决方案,基于 Micrometer 观测框架,提供:

  • 自动追踪:HTTP、消息队列、数据库、异步任务等。
  • 上下文传播:Trace ID、Span ID 跨线程、服务、消息传播。
  • 灵活导出:支持 Zipkin、Jaeger、OTLP(OpenTelemetry Protocol)。
  • 零侵入:无需修改业务代码。

官方声明:Spring Cloud Sleuth 已于 2023 年正式弃用,所有新项目必须使用 Micrometer Tracing。

Micrometer Tracing是一个基于度量库Micrometer的模块,用于在分布式系统中跟踪请求的流转,并收集相关的性能度量数据。Micrometer Tracing提供了与各种分布式跟踪工具(如Brave、Zipkin和Jaeger等)的集成,以帮助用户实现跨服务的请求跟踪和性能监控。

Micrometer Tracing使用的跟踪数据格式通常是OpenTracing和OpenTelemetry格式,这些格式提供了跟踪数据的标准表示方法和传递协议,以便于不同的跟踪工具之间的互操作性。

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

3、核心概念

一条链路追踪会在每个服务调用的时候加上Trace ID 和 Span ID链路通过TraceId唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来 (Span:表示调用链路来源,通俗的理解span就是一次请求信息)。

二、Zipkin分布式链路追踪系统展现工具

1、概述

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

Zipkin的主要功能包括跟踪数据的收集、存储、查询和可视化。

Zipkin 官方网址为:https://zipkin.io/

2、Zipkin 的下载安装运行

Zipkin 可以在 Java、Docker 和 running三种支持方式。

下载网址为:https://zipkin.io/pages/quickstart.html

下载后找到包含 zipkin-server-3.5.1-exec.jar文件的目录,在目录搜索框内输入 cmd 并回车:

启动:命令java -jar zipkin-server-3.5.1-exec.jar并回车,看到如下信息后,表示 Zipkin 成功运行。

访问:浏览器输入网址http://localhost:9411/访问。若看到如下信息,则表示 Zipkin 启动成功。

三、使用介绍

1、所需依赖

XML 复制代码
<!--micrometer-tracing指标追踪  1-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing</artifactId>
        </dependency>
        <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 2-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-brave</artifactId>
        </dependency>
        <!--micrometer-observation 3-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-observation</artifactId>
        </dependency>
        <!--feign-micrometer 4-->
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-micrometer</artifactId>
        </dependency>
        <!--zipkin-reporter-brave 5-->
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-reporter-brave</artifactId>
        </dependency>

由于Micrometer Tracing是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖。

补充包:spring-boot-starter-actuator SpringBoot框架的一个模块用于监视和管理应用程序。

2、application.yml配置

XML 复制代码
management:
  tracing:
    sampling:
      probability: 1.0    1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
    propagation:
      type: W3C           # 推荐:W3C Trace Context
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans
#日志打印
logging:
  pattern:
    level: "%5p [${spring.application.name},%X{traceId:-},%X{spanId:-}] %c - %m%n"

3、运行结果

四、示例

1、服务提供者

java 复制代码
@RestController
public class PayMicrometerController {
    /**
     * Micrometer(Sleuth)进行链路监控的例子
     * @param id
     * @return
     */
    @GetMapping(value = "/pay/micrometer/{id}")
    public String myMicrometer(@PathVariable("id") Integer id)
    {
        return "Hello, 欢迎到来myMicrometer inputId:  "+id+" \t    服务返回:" + IdUtil.simpleUUID();
    }
}

2、Api 接口 PayFeignApi

java 复制代码
@GetMapping(value = "/pay/micrometer/{id}")
public String myMicrometer(@PathVariable("id") Integer id);

3、服务调用者

java 复制代码
@RestController
public class OrderMicrometerController {
    @Resource
    private PayFeignApi payFeignApi;

    @GetMapping(value = "/feign/micrometer/{id}")
    public String myMicrometer(@PathVariable("id") Integer id){
        return payFeignApi.myMicrometer(id);
    }
}

4、测试

然后打开浏览器输入网址http://localhost/feign/micrometer/1。

若访问网址成功,则接着打开网址http://localhost:9411/。

访问结果:

详细展示SHOW,找出错误:

依赖关系:

参考博客https://blog.csdn.net/zsjdxc251/article/details/153790652

相关推荐
Coder_Boy_1 小时前
基于SpringAI的在线考试系统-相关技术栈(分布式场景下事件机制)
java·spring boot·分布式·ddd
MX_93592 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子3 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
晚霞的不甘4 小时前
CANN 编译器深度解析:UB、L1 与 Global Memory 的协同调度机制
java·后端·spring·架构·音视频
程序员泠零澪回家种桔子4 小时前
分布式事务核心解析与实战方案
分布式
凯子坚持 c5 小时前
CANN 生态中的分布式训练利器:深入 `collective-ops` 项目实现高效多卡协同
分布式
寄存器漫游者5 小时前
Linux 软件编程 - IO 编程
linux·运维·spring
我真会写代码6 小时前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm
vx_Biye_Design6 小时前
【关注可免费领取源码】房屋出租系统的设计与实现--毕设附源码40805
java·spring boot·spring·spring cloud·servlet·eclipse·课程设计
惊讶的猫6 小时前
rabbitmq实践小案例
分布式·rabbitmq