自学内容网 自学内容网

SpringCloud第六章(链路追踪Micrometer+Zipkin) -2024

目录

1:为什么需要链路追踪

2:新版链路追踪和控制台(Micrometer+Zipkin) 

3:Zipkin学习

3.1:下载安装

3.2:启动控制台

4:Micrometer Tracing学习

4.1:Micrometer Tracing链路追踪原理

 4.1:案例模拟

4.2:代码实现

4.3:结果展示


1:为什么需要链路追踪

在微服务场景下,服务调用链路很多,再出现bug的时候,找到问题并不是一件那么容易的事情,因为可能涉及到非常多组件的调用,甚至还有消息队列,数据库之类的中间件,如下图:


组件多,并且一般多是多节点集群方式部署,用户的请求量还大,想要排查一个请求的错误,无异于大海捞针,因此啊,我们就需要一种技术来帮助我们将请求给串起来,这样在出现问题之后就可以拔出萝卜带出泥的定位到没有节点的请求日志,从而轻而易举的定位到问题所在,做到有则时的改之。

在jdk1.8 springboot2.X版本中本来是使用Spring Cloud Sleuth来实现的,但是根据Sleuth官网

Spring Cloud Sleuth Reference Documentation

的解释,Spring Cloud Sleuth将无法与Spring Boot 3.X和以后一起运行。Sleuth将支持的Spring Boot的最后一个主要版本是2.x。

所以官网推荐新的链路追踪技术,来支持SpringBoot3.X,那就是 Micrometer Tracing

2:新版链路追踪和控制台(Micrometer+Zipkin) 

springboot3.x的链路追踪实现是Micrometer Tracing,有了链路追踪的日志输出,还需要对整个调用链路的日志的展示,最好有一个控制台来可视化的查看,那么就是需要一个仪表盘软件,那就是zipkin软件。

Micrometer(链路追踪)官网:https://docs.micrometer.io/micrometer/reference/

Zinkin(链路追踪展示)官网:Quickstart · OpenZipkin

3:Zipkin学习

3.1:下载安装

Zipkin下载地址:Central Repository: io/zipkin

下载了:zipkin-server-3.0.4-exec.jar,可以选择不同的版本

运行该jar包:java -jar zipkin-server-3.0.4-exec.jar

3.2:启动控制台

浏览器访问:http://127.0.0.1:9411/zipkin/

4:Micrometer Tracing学习

4.1:Micrometer Tracing链路追踪原理

我们可以先想一下在微服务中,一个请求从A调用B,B调用C,C调用D,然后逐次返回,怎么实现链路跟踪?

肯定需要定位这个请求,需要一个全局的id,在A->B->C->D的日志中,都能追踪的到这一条请求。然后需要记录ABCD中每个请求的接受时间和返回时间,便于计算在哪一步调用耗时长,然后需要一个父ID,记录调用链路是从哪里调用到哪里

一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span通过parent id 关联起来。

步骤 说明

 4.1:案例模拟

一个8080的项目调用consul上注册的服务8091和8092。在80、91、92的项目里边都引入链路监控依赖,配置Zipkin的监控,这样zipkin的控制台就能监控整个链路的。

案例模拟:我们让80睡眠2秒,91和92代码一样都睡眠5秒,预估整个链路耗时7秒。

4.2:代码实现

1:在80、91、92中都导入依赖的jar

  <!--链路追踪相关 相关的jar micrometer和zipkin -->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bom</artifactId>
            <version>1.2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-tracing-bridge-brave</artifactId>
            <version>1.2.0</version>
        </dependency>
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-observation</artifactId>
            <version>1.12.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign</groupId>
            <artifactId>feign-micrometer</artifactId>
            <version>12.5</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.reporter2</groupId>
            <artifactId>zipkin-reporter-brave</artifactId>
            <version>2.17.0</version>
        </dependency>
        <!--链路追踪相关 相关的jar micrometer和zipkin -->

2:80、91、92中都新增配置

#================zipkin链路追踪配置=============
management:
  zipkin:
    tracing:
      endpoint: http://localhost:9411/api/v2/spans #zipkin服务器地址
  tracing:
    sampling:
      probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。

3:java代码实现

//==============这是8080的controller代码==================
  @Resource
    PayFeignApi payFeignApi;
    //===============链路追踪Micrometer+Zipkin===============
    @GetMapping(value = "/consumer/pay/micrometer/{id}")
    public String getM(@PathVariable(value = "id") Integer id, HttpServletRequest request) throws InterruptedException {
        String s;
        if(id==2){
            int a=10/0;
        }

        System.out.println("链路追踪开始" +request.getServerPort()+":" + DateUtil.now()+":"+Thread.currentThread().getName());
        //feign调用consul的外部微服务服务8091和8092
        //当id=999的时候 8091、8092会休眠5S 才会返回,便于模拟整个链路追踪
        TimeUnit.SECONDS.sleep(2);
        s = payFeignApi.getMicrometer(id);
        System.out.println("链路追踪结束"+request.getServerPort()+":" + DateUtil.now()+":"+Thread.currentThread().getName());
        return s;
    }


    //micrometer 链路追踪测试,feign接口调用外部服务
    @GetMapping(value = "/pay/micrometer/{id}")
    String getMicrometer(@PathVariable(value = "id") int id);

//=============这里是8091和8092的代码 代码一样,也可以配置VM参数 不同端口启动===================

    @GetMapping(value = "/pay/micrometer/{id}")
    public String get(@PathVariable(value = "id") int id, HttpServletRequest request){
        System.out.println("千分尺链路追踪开始"+request.getServerPort()+":" + DateUtil.now());
        if (id==-1){
            throw new RuntimeException("id不能为-1");
        }
        if (id==999){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("千分尺链路追踪异常:"+ DateUtil.now());
                //throw new RuntimeException(e);
            }
        }
        System.out.println("千分尺链路追踪结束"+request.getServerPort()+":"+ DateUtil.now());
        return "千分尺链路追返回值"+request.getServerPort()+":"+id+"\t"+ IdUtil.simpleUUID();
    }

4.3:结果展示

启动80、91、92、consul、zipkin服务。

我们请求80当id=999的时候,80睡眠2S,91或者92睡眠5S

http://localhost:8080/consumer/pay/micrometer/999

截图如下:



原文地址:https://blog.csdn.net/huyiju/article/details/142597619

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!