1.5 服务链路追踪 Micrometer Tracing
Micrometer Tracing 是 Sleuth 的替代方案。服务链路追踪技术 Micrometer Tracing 是用来进行数据采样的,最后通过 ZipKin 将数据通过 Web 进行可视化展示。分布式链路追踪技术主要是为了将一个分布式请求转换成调用链路的形式,通过记录日志、性能监控将一次分布式请求的链路调用集中展示。如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。分布式链路追踪技术能够在微服务出现异常情况时能够更轻松的发现是哪一个服务单元的问题。
在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。

Micrometer Tracing 是新一代的 Sleuth,该组件只支持3.x版本以上的 Spring Boot 框架。老版本的 Sleuth 仍然支持2.x版本的 SprintBoot 版本的框架。具体信息可参考官方网址https://docs.spring.io/spring-cloud-sleuth/docs/current/reference/html/、https://spring.io/projects/spring-cloud-sleuth#overview、https://micrometer.io/docs/tracing、https://github.com/spring-cloud/spring-cloud-sleuth。

Spring Cloud Sleuth(Micrometer Tracing)提供了一套完整的分布式链路追踪解决方案且兼容支持 Zipkin 展现。将一次分布式请求还原成调用链路,进行日志记录、性能监控。最后将分布式请求的调用链路通过 Zipkin 展现。

行业内比较成熟的分布式链路追踪技术解决方案如下图所示。

分布式链路追踪原理:
假定三个微服务调用的链路如下图所示:Service 1 调用 Service 2,Service 2 调用 Service 3 和 Service 4。

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

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

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

当没有配置 Sleuth 链路追踪的时候,INFO 信息里面是 [passjava-question,],后面跟着三个空字符串。当配置了 Sleuth 链路追踪的时候,追踪到的信息是 [passjava-question,504a5360ca906016,e55ff064b3941956,false] ,第一个是 Trace ID,第二个是 Span ID。**只有日志没有图,观看不方便,不美观,so,**引入图形化Zipkin链路监控让你好看,O(∩_∩)O。

Zipkin 的下载安装运行
Zipkin 可以在 Java、Docker 和 running三种支持方式,下载网址为https://zipkin.io/pages/quickstart.html。本节主要下载 Java 版本的Zipkin,版本信息为 zipkin-server-3.5.1-exec.jar。具体操作如下所示。


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

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

接着,打开浏览器,输入网址http://localhost:9411/访问 Zipkin 的 Web 页面。若看到如下信息,则表示 Zipkin 启动成功。

1.5.2 Micrometer 和 Zipkin 搭建链路监控案例
Micrometer Tracing 和 Zipkin 是相互协作的关系,Micrometer Tracing 负责调用链路数据采样的工作,Zipkin 负责将采集到的调用链路数据以可视化的方式通过 Web 页面展示出来。
Micrometer Tracing 和 Zipkin 相互协作搭建链路监控的案例步骤如下所示。
-
总体父工程 pom.xml 文件。具体需要引入的依赖如下所示。
xml<properties> <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> </properties> <!--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是一个门面工具自身并没有实现完整的链路追踪系统,具体的链路追踪另外需要引入的是第三方链路追踪系统的依赖:
1 micrometer-tracing-bom 导入链路追踪版本中心,体系化说明 2 micrometer-tracing 指标追踪 3 micrometer-tracing-bridge-brave 一个Micrometer模块,用于与分布式跟踪工具 Brave 集成,以收集应用程序的分布式跟踪数据。Brave是一个开源的分布式跟踪工具,它可以帮助用户在分布式系统中跟踪请求的流转,它使用一种称为"跟踪上下文"的机制,将请求的跟踪信息存储在请求的头部,然后将请求传递给下一个服务。在整个请求链中,Brave会将每个服务处理请求的时间和其他信息存储到跟踪数据中,以便用户可以了解整个请求的路径和性能。 4 micrometer-observation 一个基于度量库 Micrometer的观测模块,用于收集应用程序的度量数据。 5 feign-micrometer 一个Feign HTTP客户端的Micrometer模块,用于收集客户端请求的度量数据。 6 zipkin-reporter-brave 一个用于将 Brave 跟踪数据报告到Zipkin 跟踪系统的库。 补充包:spring-boot-starter-actuator SpringBoot框架的一个模块用于监视和管理应用程序。
-
服务提供者8001
修改包 cloud-provider-payment8001,主要操作如下所示。
-
修改 pom.xml 文件,主要添加如下依赖。
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>
-
写 application.yml 文件。主要配置如下信息。
yml# ========================zipkin=================== management: zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans tracing: sampling: probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
-
新建业务类 PayMicrometerController,主要设置如下业务。
javapackage com.atguigu.controller; import cn.hutool.core.util.IdUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @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(); } }
-
-
Api 接口 PayFeignApi
在该接口内新增对应上述支付业务8001的抽象方法。
java/** * Micrometer(Sleuth)进行链路监控的例子 * @param id * @return */ @GetMapping(value = "/pay/micrometer/{id}") public String myMicrometer(@PathVariable("id") Integer id);
-
服务调用者80
修改订单服务80 包名为 cloud-consumer-feign-order80。
-
修改 pom.xml 文件,添加如下依赖。
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>
-
写 application.yml 文件,添加如下配置信息。
yml# zipkin图形展现地址和采样率设置 management: zipkin: tracing: endpoint: http://localhost:9411/api/v2/spans tracing: sampling: probability: 1.0 #采样率默认为0.1(0.1就是10次只能有一次被记录下来),值越大收集越及时。
-
新建业务类 OrderMicrometerController,主要业务如下所示。
javapackage com.atguigu.controller; import com.atguigu.apis.PayFeignApi; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController @Slf4j public class OrderMicrometerController { @Resource private PayFeignApi payFeignApi; @GetMapping(value = "/feign/micrometer/{id}") public String myMicrometer(@PathVariable("id") Integer id) { return payFeignApi.myMicrometer(id); } }
-
-
测试,依次启动8001和80,然后打开浏览器输入网址http://localhost/feign/micrometer/1。若访问网址成功,则接着打开网址http://localhost:9411/。根据下图进行操作。
根据上图的展示结果,带年纪按钮 show 进行查看服务链路追踪。
接着点击右上角的 Dependences(依赖),查看服务之间的依赖关系。