【微服务】链路追踪 - Micrometer(day9)

概述

引入

在微服务架构下,客户端一个请求不再仅仅通过一个后端服务和数据库服务就能返回响应,而是通过多个服务节点的协同调用才会产生最终的响应。因此,一个简单的请求就可能会形成一个复杂的分布式服务调用链路,链路中的任何一个服务出错或调用时间过长都会引起整个请求最后的失败。

当服务失败之后,我们就要快速定位具体是哪个服务节点发生了错误,但是我们使用人工一个一个排查就会造成巨大的人力浪费。并且我们还深知,写新需求不复杂,找错误、修bug才最难搞。

基于上述情况,微服务就研发了一套组件来解决上述问题,即分布式链路追踪。所谓的分布式链路追踪,就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如请求经过各个服务节点的耗时,请求具体到哪台机器上,每个服务节点的请求状态等。

简单来说,分布式链路追踪就是把一个请求经过的所有节点都记录下来,包括但不限于耗时,父亲节点,节点状态等等。

Micrometer

Micrometer就是分布式链路追踪的落地组件,SpringCloudSleuth是分布式链路追踪的上一代组件。不过由于现在使用的是SpringBoot3以上的版本,因此与Sleuth不再兼容,该篇文章中,主要学的也是Micrometer组件。并且与zipkin相结合使用,下图所示,Micrometer将一次请求经过的路径进行记录,然后交给zipkin进行展现。

原理

一个请求通过一个TraceId来唯一标识,对于每个服务节点来说,都使用SpanId来标识,各个服务节点还会记录一个ParentId。最后通过TraceId、SpanId和ParentId将整条链路进行追踪。

其他组件

Cat:由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控、业务监控,集成方案是通过代码埋点的方式来实现监控。比如:拦截器、过滤器等。对代码的侵入性很大、集成成本较高、风险很大。

Zipkin:由Twitter公司开源,开发源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储查找和展现,结合SpringCloudSleuth使用较为简单,集成方便,但是功能较简单。

Pinpoint:是一款开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能强大,接入端无代码侵入。

Skywalking:是中国人开源的基于字节码注入的调用链分析,以及应用监控分析工具,特点是支持多种插件,UI功能较强,接入端无代码侵入。

ZipKin

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

简单来说,ZipKin就是用来展示分布式链路追踪的结果,使得开发人员能够轻松便捷的找到问题出现的原因,然后着手解决。

使用官网进行下载:

下载成功之后,直接在其对应页面打开cmd,然后使用java -jar 文件名就可以运行了:

 

 启动之后,进入127.0.0.1:9411/zipkin/看到如下画面,就算启动成功了。

案例代码

在该案例中,共创建了四个服务,链路代码是服务A调用服务B,服务B可以调用服务C和服务D。采用的技术栈有:Nacos、OpenFeign、LoadBalancer以及今天的主角Micrometer和ZipKin。

父工程中引入依赖

            <!--链路追踪-->
            <micrometer-tracing.version>1.2.0</micrometer-tracing.version>
            <micrometer-observation.version>1.12.0</micrometer-observation.version>
            <feign-micrometer.version>12.5</feign-micrometer.version>
            <zipkin-reporter-brave.version>2.17.0</zipkin-reporter-brave.version>

            <!--链路追踪-->
            <!--micrometer-tracing-bom导入链路追踪版本中心  1-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing-bom</artifactId>
                <version>${micrometer-tracing.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--micrometer-tracing指标追踪  2-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing</artifactId>
                <version>${micrometer-tracing.version}</version>
            </dependency>

            <!--micrometer-tracing-bridge-brave适配zipkin的桥接包 3-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-tracing-bridge-brave</artifactId>
                <version>${micrometer-tracing.version}</version>
            </dependency>

            <!--micrometer-observation 4-->
            <dependency>
                <groupId>io.micrometer</groupId>
                <artifactId>micrometer-observation</artifactId>
                <version>${micrometer-observation.version}</version>
            </dependency>

            <!--feign-micrometer 5-->
            <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-micrometer</artifactId>
                <version>${feign-micrometer.version}</version>
            </dependency>

            <!--zipkin-reporter-brave 6-->
            <dependency>
                <groupId>io.zipkin.reporter2</groupId>
                <artifactId>zipkin-reporter-brave</artifactId>
                <version>${zipkin-reporter-brave.version}</version>
            </dependency>

创建模块

由于这几个模块只用于测试分布式链路追踪,所以四个模块中内容几乎相同。

引入pom文件

四个模块的pom文件几乎相同,只有GAV不太相同,所以我只引入一个,剩下的大家稍稍修改一下就好了。

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.wbz</groupId>
        <artifactId>spring-cloud-test</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>cloud-micrometer-two-8602</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!--注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--基础模块-->
        <dependency>
            <groupId>com.wbz</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

        <!--链路追踪-->
        <!--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>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

    </dependencies>

</project>

写yml文件

同样,yml文件中也是端口号和服务名不一样,大家自己修改一下就好。

server:
  port: 8602

spring:
  application:
    name: cloud-micrometer-two-8602

  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        service: ${spring.application.name}

  profiles:
    active: dev

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

写启动类

在启动类中,服务1和服务2都要远程调用,所以要加入开启远程调用的注解。当然,服务三和服务四也可以开启,不过要注意服务三和服务四是否有OpenFeign的依赖。

@EnableFeignClients // 远程调用
@SpringBootApplication
public class MicrometerCloudApplication8602 {

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

}

写业务类和远程调用的接口

服务三和服务四

@RestController
@RequestMapping("/three")
public class ThreeController {

    @GetMapping("/get/three")
    public String getContent() {
        return "第三个服务,被第二个服务调用" + '\n';
    }

}
@RestController
@RequestMapping("/four")
public class FourController {

    @GetMapping("/get/four")
    public String getContent() {
        return "第四个服务,被第二个服务调用" + '\n';
    }

}
@FeignClient(value = "cloud-micrometer-three-8603", path = "/three")
public interface MicrometerThreeFeignApi {

    @GetMapping("/get/three")
    String getContent();

}
@FeignClient(value = "cloud-micrometer-four-8604", path = "/four")
public interface MicrometerFourFeignApi {

    @GetMapping("/get/four")
    String getContent();

}

服务二

@FeignClient(value = "cloud-micrometer-two-8602", path = "/two")
public interface MicrometerTwoFeignApi {

    @GetMapping("/get/twoOfOne")
    String twoOfOne();

    @GetMapping("/get/twoOfTwo")
    String twoOfTwo();

}
@RestController
@RequestMapping("/two")
public class TwoController {

    @Resource
    private MicrometerThreeFeignApi micrometerThreeFeignApi;

    @Resource
    private MicrometerFourFeignApi micrometerFourFeignApi;

    @GetMapping("/get/twoOfOne")
    public String twoOfOne() {
        return "第二个服务,被第一个服务调用,然后调用第三个服务" +
                this.micrometerThreeFeignApi.getContent();
    }

    @GetMapping("/get/twoOfTwo")
    public String twoOfTwo() {
        return "第二个服务,被第一个服务调用,然后调用第四个服务" +
                this.micrometerFourFeignApi.getContent();
    }

}

服务一

@RestController
@RequestMapping("/one")
public class OneController {

    @Resource
    private MicrometerTwoFeignApi micrometerTwoFeignApi;

    @GetMapping("/getOneOfOne")
    public String getOneOfOne() {
        return "第一个服务,调用第二个服务" + '\n' +
                this.micrometerTwoFeignApi.twoOfOne();
    }

    @GetMapping("/getOneOfTwo")
    public String getOneOfTwo() {
        return "第一个服务,调用第二个服务" + '\n' +
                this.micrometerTwoFeignApi.twoOfTwo();
    }

}

测试

启动服务之后,分别调用127.0.0.1:one/getOneOfOne以及127.0.0.1:one/getOneOfTwo,多调用几次,然后稍等几分钟,再去ZipKin官网看看。

在官网,点击运行查询,就能出现如下结果,也可以点进去详细查看,就是一个请求对应的每个节点的耗时时间等内容。

然后去依赖页面,再次点击运行查询,就会出现一个调用图:

 

当然,在页面当中,还有许多详细信息,就不作过多介绍,不是我不想说,主要我也不知道。所以那些详细信息,就让咋们一起去探索吧,只希望别我毕业了,组件又换了。 

### 回答1: Micrometer-Registry-Influx 是一个用于监控和测量微服务架构中度量指标的框架。它与InfluxDB时序数据库集成,可以收集、存储和查询微服务应用程序的度量数据。通过使用Micrometer-Registry-Influx,我们可以实时地监控微服务应用程序的性能和健康状况。 Micrometer-Registry-Influx 提供了一个简单且易于使用的API,开发人员可以使用该API来收集和记录关键的性能指标,例如请求延迟、吞吐量和错误率等。这些指标可以帮助我们了解系统中的瓶颈和问题,并进行性能优化和故障排除。 Micrometer-Registry-Influx与InfluxDB的集成使得数据的存储和查询变得非常简单和高效。我们可以配置Micrometer-Registry-Influx将数据推送到InfluxDB中,然后可以使用InfluxDB的查询语言来分析和可视化这些数据。这使得我们可以根据需要创建仪表盘和报告,进一步深入了解应用程序的性能和运行状况。 总之,Micrometer-Registry-Influx 是一个有用的工具,可以帮助我们监控和度量微服务架构中的应用程序。通过使用这个框架,我们可以轻松地收集和记录关键的性能指标,并通过InfluxDB进行数据存储和查询。这将帮助我们更好地理解和优化我们的应用程序,提供更好的用户体验。 ### 回答2: Micrometer-Registry-Influx是一个基于Micrometer的监控指标库,用于将应用程序的度量数据导出到InfluxDB中的一个注册表。 Micrometer是一个跨应用程序的度量指标库,它提供了一个统一的API,用于收集应用程序的各种度量数据,例如计数器、计时器和分布式度量。Micrometer可以与多个监控系统进行集成,以提供实时的应用程序性能监控和故障排除能力。 Registry是Micrometer的一个关键组件,它负责管理和存储收集的度量指标。Micrometer-Registry-Influx是一个特定于InfluxDB的注册表实现,它允许应用程序将收集的度量指标数据发送到InfluxDB中进行存储和分析。 使用Micrometer-Registry-Influx,开发人员可以轻松地将应用程序的度量数据导出到InfluxDB中。首先,开发人员需要创建一个InfluxDB的连接配置,并将其配置到应用程序中。然后,他们可以使用Micrometer提供的API来定义和收集各种度量指标,例如请求的响应时间、数据库查询的执行时间等。最后,利用Micrometer-Registry-Influx的功能,开发人员可以将这些度量指标数据发送到InfluxDB中进行存储和分析。 通过将应用程序的度量数据导出到InfluxDB中,开发人员可以获得实时的应用程序性能监控,并能够进行深入的故障排除和性能优化。此外,InfluxDB提供了强大的查询和分析功能,使开发人员能够从庞大的度量数据集中提取有价值的见解。 总而言之,Micrometer-Registry-Influx是一个方便的监控指标库,它使开发人员能够将应用程序的度量数据导出到InfluxDB中,从而提供实时的应用程序性能监控和灵活的数据分析能力。 ### 回答3: Micrometer-registry-influx是一个用于监控和度量的开源库,它与Micrometer指标库和InfluxDB时间序列数据库集成。Micrometer-registry-influx 提供了一个方便的方式,可以将Micrometer生成的度量指标数据发送到InfluxDB进行存储和可视化分析。 Micrometer是一个用于应用程序性能监控和度量的度量指标库。它提供了一个简单的API,开发人员可以使用该API在应用程序中记录各种指标数据,比如计数器、计时器、直方图和分布式摘要等。Micrometer-registry-influx是Micrometer的一个扩展,它允许将Micrometer生成的指标数据导入到InfluxDB。 InfluxDB是一个高效的时间序列数据库,专为处理大量高频率写入和查询的时间序列数据而设计。它使用InfluxQL查询语言,可以方便地对时间序列数据进行查询和分析。通过与Micrometer-registry-influx集成,我们可以实时监测应用程序的性能指标,并将这些指标数据存储到InfluxDB中进行长期保留和分析。 使用Micrometer-registry-influx,开发人员可以从应用程序中轻松获取各种重要的性能指标数据,并将其发送到InfluxDB进行存储。这些指标数据可以用于实时监控应用程序的性能,并进行趋势分析和性能优化。同时,通过使用InfluxDB的功能,可以对指标数据进行复杂的查询和可视化分析,以获得更深入的洞察力。 总之,Micrometer-registry-influx是一个强大的工具,可以帮助开发人员监控和度量应用程序的性能。通过将Micrometer生成的指标数据导入到InfluxDB中,我们可以轻松地实现实时监测和分析,以优化应用程序的性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

王彬泽

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

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

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

打赏作者

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

抵扣说明:

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

余额充值