Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth

2024-06-03 09:58

本文主要是介绍Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 概述

Spring Cloud Sleuth实现对Spring cloud 分布式链路监控 
本文介绍了和Sleuth相关的内容,主要内容如下:

  • Spring Cloud Sleuth中的重要术语和意义:Span、Trance、Annotation
  • Zipkin中图形化展示分布式链接监控数据并说明字段意义
  • Spring Cloud集成Sleuth + Zipkin 的代码demo: Sleuth集成Zipkin, Zipkin数据持久化等

2. 术语

Span 
Span是基本的工作单元。Span包括一个64位的唯一ID,一个64位trace码,描述信息,时间戳事件,key-value 注解(tags),span处理者的ID(通常为IP)。 
最开始的初始Span称为根span,此span中span id和 trace id值相同。

Trance 
包含一系列的span,它们组成了一个树型结构

Annotation 
用于及时记录存在的事件。常用的Annotation如下

  • cs - Client Sent:客户端发送一个请求,表示span的开始
  • sr - Server Received:服务端接收请求并开始处理它。(sr-cs)等于网络的延迟
  • ss - Server Sent:服务端处理请求完成,开始返回结束给服务端。(ss-sr)表示服务端处理请求的时间
  • cr - Client Received:客户端完成接受返回结果,此时span结束。(cr-sr)表示客户端接收服务端数据的时间

如果一个服务的调用关系如下: 
这里写图片描述

那么此时将Span和Trace在一个系统中使用Zipkin注解的过程图形化: 
这里写图片描述

每个颜色的表明一个span(总计7个spans,从A到G),每个span有类似的信息

Trace Id = X
Span Id = D
Client Sent

span表示span的Trance Id是X,Span Id是D,同时它发送一个Client Sent事件

spans 的parent/child关系图形化如下: 
这里写图片描述

3. 在Zipkin中图形化展示分布式链接监控数据

3.1 spans在zipkin界面的信息解读

在Zipkin中展示了上图的跟踪信息,红框里是对上图调用span的跟踪 
这里写图片描述

但是你点击这个trace时,我们只看到4个span 
这里写图片描述

为什么两个界面显示的span数量不同,一个是7,一个4.

  • 1 个 spans:来自servier1的接口http:/start 被调用,分别是Server Received (SR) 和 Server Sent (SS) annotations.
  • 2 个 spans:来自 service1 调用service2 的 http:/foo 接口。service1 端有两个span,分别为 Client Sent (CS) 和 Client Received (CR) annotations。service2 端也有两个span,分别为Server Received (SR) 和Server Sent (SS) 。物理上他有2个span,但是从逻辑上说这个他们组成一个RPC调用的span。
  • 2个span:来自 service2 调用 service3 的 http:/bar 接口,service2 端有两个span,分别为Client Sent (CS) 和 Client Received (CR) annotations。service3 端也有两个span,分别为Server Received (SR) 和Server Sent (SS) 。物理上他有2个span,但是从逻辑上说它们都是同一个RPC调用的span。
  • 2个span:来自 service2 调用 service4 的 http:/bar 接口,service2 端有两个span,分别为Client Sent (CS) 和 Client Received (CR) annotations。service4 端也有两个span,分别为Server Received (SR) and Server Sent (SS) 。物理上他有2个span,但是从逻辑上说这个它们都是同一个RPC调用的span。

所以我们计算物理spans有7个:

  • 1个来自 http:/start 被请求
  • 2个来自 service1调用service2
  • 2个来自 service2调用service3
  • 2个来自 service2调用service4.

从逻辑上说,我们只看到4个span:

  • 1个来自 service1 的接口http:/start 被请求
  • 3个来自 服务之前的RCP接口调用

3.2. Zipkin可视化错误

如果调用链路中发生接口调用失败,zipkin会默认使用红色展示信息,如下图: 
这里写图片描述
点击红色的span,可以看到详细的失败信息: 
这里写图片描述

4. Spring Cloud集成Sleuth + Zipkin

本节演示在Spring Cloud中集成Sleuth并将链路监控数据传送到Zipkin,使用Zipkin展示数据,并配置mysql进行数据持久化

4.1. 相关工程

cloud-registration-center 
注册中心

cloud-service-zipkin 
提供测试服务接口,对外提供有两个接口: 
- 调用成功后,马上返回一个结果: http://127.0.0.1:17602//zipkin/simple 
- 调用成功后,服务sleep 5s后再返回: http://127.0.0.1:17602//zipkin/sleep

cloud-consumer-zipkin 
消费服务 
此服务会通过Feign调用cloud-service-zipkin里提供的两个接口(/zipkin/sleep和/zipkin/simple),我们访问如下URL会调用的对应的接口: 
http://127.0.0.1:17603//zipkin/simple 
http://127.0.0.1:17603//zipkin/sleep

以上3个服务的代码比较简单,这里代码略,可以自己看github里的代码。下文中只列出和Sleuth和Zipkin相关的配置。

cloud-dashboard-zipkin 
配置Zipkin服务,提供可视化链路监控 
Zipkin首页:http://127.0.0.1:17601/zipkin/

4.2. 在工程中使用sleuth+zipkin+http配置

在cloud-service-zipkin和cloud-consumer-zipkin中启动sleuth,sleuth会收集spans信息,并使用http异步地将spans 信息发送到Zipkin,然后Zipkin展示信息

cloud-service-zipkin和cloud-consumer-zipkin配置Sleuth+Zipkin 
2个工程中为了集成Sleuth和Zipkin,需要在普通工程基础上增加如下配置:

  • pom.xml增加sleuth和zipkin相关的jar
<!-- sleuth配置 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- 引入zipkin  -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • pplication-zipkin.yml 
    Zipkin+Sleuth配置参数: 
    • spring.zipkin.baseUrl:指定cloud-dashboard-zipkin的服务地址,本例子中使用真实的IP。在新的版本spring-cloud-sleuth-core-1.3.0.RELEASE中,可以实现通过服务名称进行访问
    • spring.sleuth.sampler.percentage:设置采样率,为了测试设置100%采集
spring:zipkin:enabled: true# zipkkin dashboard的地址:通过真实IP地址访问baseUrl: http://localhost:17601/# 通过cloud-dashboard-zipkin注册到注册中心的服务名称访问,本版本(spring-cloud-sleuth-core-1.2.5.RELEASE)不支持,需要从spring-cloud-sleuth-core-1.3.0.RELEASE开始支持这个功能# 配置如下:# baseUrl: http://cloud-dashboard-zipkin/sleuth:sampler:#  默认值为0.1f,现在为了测试设置100%采集percentage: 1

cloud-dashboard-zipkin 
配置zipkin服务

  • pom.xml
<!-- spring-cloud-starter-zipkin -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<!-- zipkin 界面-->
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-ui</artifactId>
</dependency>
<!-- zipkin 服务类-->
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId>
</dependency>
  • bootstrap-zipkin-http.yml

配置参数 

# port
server:port: 17601spring:application:# 本服务注册到注册到服务器的名称, 这个名称就是后面调用服务时的服务标识符name: cloud-dashboard-zipkin
eureka:client:serviceUrl:# 服务器注册/获取服务器的zonedefaultZone: http://127.0.0.1:10761/eureka/# defaultZone: http://192.168.21.3:10761/eureka/,http://192.168.21.4:10761/eureka/instance:prefer-ip-address: true
  • 关闭本工程的推送到zipkin服务的功能

pplication-zipkin-http.yml 

spring:zipkin:enabled: false

启动类: 
@EnableZipkinServer:注解此类为Zipkin服务4.3. 测试

启动zipkin服务,提供可视化链路监控 
Zipkin访问地址: http://127.0.0.1:17601/zipkin/

我们演示链路跟踪,访问以下两个请求: 
http://127.0.0.1:17603/zipkin/simple :正常方法 
http://127.0.0.1:17603/zipkin/sleep :访问超时

进入zipkin,访问成功为蓝色,失败为红部。同时显示各个服务花费的时间 
这里写图片描述

点击蓝色记录,进入详细界面 
可知整个接口花费约19ms,cloud-zipkin-service的业务执行15ms,cloud-zipkin-consumer访问cloud-zipkin-service的 网络延迟为2ms,返回结果给cloud-zipkin-service的网络延迟是4s 
这里写图片描述

点击cloud-zipkin-service得到更精确的数据

这里写图片描述

4.4. Zipkin数据持久化

默认情况,zipkin存储记录到内存,如果服务重启,则所有记录丢失。为了保证持久性,zipkin支持Mysql、Elasticsearch、Cassandra存储。我们演示为zipkin配置MYSQL数据库,其它两种配置类似,本文略 
pom.xml为cloud-dashboard-zipkin引入新jar配置参数: 

application-zipkin-http.yml: 
配置启动时会根据classpath:/mysql.sql初始化数据库重启服务,服务成功后,查看数据库,自动生成数据库 

这里写图片描述

如此数据库配置完毕,所有的spans信息存储到数据库中,重启服务,也不会丢失记录

4.5 在工程中使用sleuth+zipkin+ Spring Cloud Stream配置

本版本(spring-cloud-sleuth-core-1.2.5.RELEASE)支持集成spring-cloud-sleuth-stream,但是在新版本从spring-cloud-sleuth-core-1.3.0.RELEASE开始不支持spring-cloud-sleuth-stream。推荐直接使用通过集成RabbitMQ 或 Kafka。关于集成RabbitMQ 或 Kafka,关键是引入spring-rabbit 或 spring-kafka依赖包。默认的目的名称为zipkin. 
对于这个的使用demo。这里暂时略

5. 代码

以上的详细的代码见下面 
github代码,请尽量使用tag v0.11,不要使用master,因为我不能保证master代码一直不变

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hry2015/article/details/78905489

这篇关于Spring cloud系列十四 分布式链路监控Spring Cloud Sleuth的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1026666

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有