分布式链路追踪

140 阅读3分钟

SpringCloud学习4-Micrometer服务链路追踪

Micrometer

Micrometer之分布式链路追踪概述:

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

分布式链路追踪技术要解决的问题,分布式链路追踪(Distributed Tracing),就是将一次分布式请求还原成调用链路,进行日志记录,性能监控并将一次分布式请求的调用情况集中展示。比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

Micrometer负责链路调用数据(指标、参数、日志等)的收集,收集完成之后全部发送给ZipKin展现

总结:Micrometer将一次分布式请求还原成调用链路,进行日志记录和性能监控,并将一次分布式请求的调用情况集中Web展示(展现者由ZipKin负责)

分布式链路追踪原理:

一条链路追踪会在每个服务调用的时候加上Trace ID(全局ID) 和 Span ID(每次请求发出ID),链路通过TraceId作为唯一标识

Span用来标识发起的请求信息,各span通过parent id关联起来(Span:表示调用链路来源,即span就是一次请求信息)

即:一条链路通过Trace ID为唯一标识,Span用来标识发起的请求,各span通过parent id关联起来

案例:

假定3个微服务调用的链路:

Service1调用Service2,Service2调用Service3和Service4

链路追踪1.png

链路追踪2.png :一条链路的Trace ID是相同的,但是每个请求信息的span id是不同的,下一个服务节点的parent id指向上个服务节点的span id,这样就形成了调用链路,而Micrometer来记录各个节点的请求、接收响应等信息。

ZipKin

Zipkin是一种分布式链路跟踪系统图形化的工具,Zipkin 是 Twitter 开源的分布式跟踪系统,能够收集微服务运行过程中的实时调用链路信息,并能够将这些调用链路信息展示到Web图形化界面上供开发人员分析,开发人员能够从ZipKin中分析出调用链路中的性能瓶颈,识别出存在问题的应用程序,进而定位问题和解决问题。(感觉类似于Mysql和DateGrip的关系,来图形化展示各个节点的相关情况便于观察)

使用:先运行jar,然后在浏览器输入Zipkin,就可以访问ZipKin

Micrometer+ZipKin搭建分布式链路追踪监控案例:

Micrometer:数据采样; ZipKin:图形展示

使用步骤:

在想要检测调用者和服务提供者模块都进行ZipKin的配置

  • 在父工程的pom文件中导入依赖

     <!--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>
    
  • 父工程导入版本

    <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>
    
  • 在要监测的服务端和服务客户端模块的pom文件中导入依赖

    
            <!--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>
    
  • 在要监测的服务端和服务客户端模块的yml文件写入对应配置

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

    之后在ZipKin上就可以图形化的查看相应的调用痕迹和服务之间的依赖关系(谁调用谁)