SpringBoot实战(二十二)集成 Sleuth、Zipkin

news2024/11/29 19:43:58

目录

    • 一、简介
      • 1.Sleuth
      • 2.Zipkin
    • 二、搭建 zipkin-server
      • 1.jar包启动
      • 2.docker启动
      • 3.自己搭建
        • **Maven依赖**
        • 添加启动类注解
      • 4.页面截图
    • 三、搭建 sleuth-zipkin
      • 1.Maven 依赖
      • 2.yaml配置
      • 3.代码实现
        • DemoController.java
        • DemoFeignClient.java
      • 4.测试

一、简介

1.Sleuth

  • 官方文档: https://spring.io/projects/spring-cloud-sleuth
  • GitHub: https://github.com/spring-cloud/spring-cloud-sleuth

Sleuth 是一个分布式跟踪系统,用于跟踪应用程序中的请求和操作。它可以帮助我们了解应用程序的结构和性能,并定位问题的根本原因。Sleuth 可以与 Zipkin 等分布式跟踪系统配合使用,从而提供更全面的应用程序跟踪和分析功能。

Sleuth 在 Spring Boot 中提供了一个便捷的集成方式。它可以轻松地跟踪应用程序中的请求和操作,并将跟踪信息记录到日志文件中。这使得我们可以更轻松地了解应用程序的结构和性能,并快速定位问题的根本原因。

Sleuth 核心概念:

  • trace:跟踪,一个 Trace 表示一个请求或操作的完整的调用链,从客户端发起请求开始,到服务端响应请求结束。
  • span:跨度,一个 Span 表示一个请求或操作的一部分,它包含了一些有用的信息,如开始时间、结束时间、操作名称等。
  • traceId:跟踪ID,一个 Trace ID 是一个唯一的标识符,它用于将一组 Span 关联在一起,形成一个完整的 Trace。
  • spanId:跨度ID,一个 Span ID 是一个唯一的标识符,它用于标识一个 Span。

在 Sleuth 中,每个请求或操作都会生成一个 Trace,并且每个 Trace 包含多个 Span。每个 Span 包含一个唯一的 Span ID,并与一个 Trace ID 相关联。通过 Trace ID 和 Span ID,我们可以将多个 Span 关联在一起,形成一个完整的 Trace。

2.Zipkin

  • 官方网站: https://zipkin.io/
  • 官方文档: https://zipkin.io/pages/quickstart
  • GitHub: https://github.com/openzipkin/zipkin

Zipkin 是一个分布式流程跟踪系统。可以用来收集请求时间数据,从而解决服务体系结构中的延迟问题。功能包括数据收集和数据查看。

Zipkin 核心概念:

  • Annotation:用于定位一个请求的开始和结束,主要包含 cs/cf/ss/sf 四个时间点。当这个 Annotation 被记录了,这个 PRC 也被认为完成了。四个时间点按顺序发生:

    • cs:Client Start,表示客户端发起请求,一个 Span 的开始。
    • ss:Service Start,表示服务端收到请求。
    • cf:Client Finish,表示客户端获取到服务端的返回信息,一个 Span 的结束。
    • sf:Service Finish,表示服务端完成处理,并将结果发送给客户端。
    • ss-cs=网络延迟时间
    • sf-ss=逻辑处理时间
    • cf-cs=整个流程时间
  • Collector:接收或收集各个应用传输的数据,跟踪一个 HTTP 请求的工作流程:

    1.把当前调用链的 trace 信息添加到 HTTP Header 里面;

    2.记录当前调用的时间戳;

    3.发送 HTTP 请求,把 trace 相关的 header 信息携带上;

    4.调用结束之后,记录当前调用花费的时间;

    5.然后把上面流程产生的信息汇集成一个 span,把 span 信息上传到 zipkin 的 Collector 模块;

    6.下一个 HTTP 请求继续从第一步开始。

Zipkin 使用流程:

如果日志文件中有 traceId,则可以直接跳转到具体位置。或者,我们可以根据服务名称、操作名称、标签和持续时间等属性进行查询。Zipkin 可以帮我们汇总一些有用的数据,例如:在服务中花费的时间百分比,以及操作是否失败等。如下所示:

在这里插入图片描述

Zipkin 的 UI 还提供了一个依赖关系图,显示通过每个应用程序跟踪的请求书。有助于我们识别聚合行为,包括错误路径或对已弃用服务的调用。

在这里插入图片描述

使用 Zipkin 来查看数据,就需要应用向 Zipkin 发送数据。目前最流行的方法是通过 HTTP 或 Kafka,其他还可以使用例如 Apache ActiveMQ、gRPC 和 RabbitMQ等。提供给 Zipkin UI 的数据会存储在内存中,或者可以使用支持的后端(如 Apache Cassadra 或 Elasticsearch)来永久存储。

二、搭建 zipkin-server

zipkin-server 是 Zipkin 的服务端,集成了 UI 界面来进行查看。zipkin-server 可以自己去官网下载已有的独立 jar 包,或者 docker 镜像进行使用:

1.jar包启动

  • jar包下载地址: https://repo1.maven.org/maven2/io/zipkin/zipkin-server/

或者可以直接执行以下命令来下载最新版本 jar 包:

# 下载zipkin.jar
curl -sSL https://zipkin.io/quickstart.sh | bash -s
# 启动zipkin.jar
java -jar zipkin.jar

命令执行截图:

在这里插入图片描述

2.docker启动

  • docker 镜像地址: https://hub.docker.com/r/openzipkin/zipkin

执行以下命令来拉取最新镜像:

# 拉取镜像
docker pull openzipkin/zipkin
# 启动镜像
docker run -d -p 9411:9411 openzipkin/zipkin

在这里插入图片描述

下面主要说下我们自己搭建的过程。

3.自己搭建

注意:SpringBoot 2.2.x 以后的版本,不再支持自己搭建服务,之前是通过 @EnableZipkinServer 注解,现在这个注解不起作用了。所以 SpringBoot 2.2.x 以后的版本只能使用 jar 包或 docker 来启动。

SpringBoot 2.1.x 及以下的版本可以通过以下方式自己搭建:

Maven依赖

<!-- zipkin-server -->
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-server</artifactId>
    <version>${zipkin.server.version}</version>
</dependency>
<dependency>
    <groupId>io.zipkin.java</groupId>
    <artifactId>zipkin-autoconfigure-ui</artifactId>
    <version>${zipkin.server.version}</version>
</dependency>

添加启动类注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin2.server.internal.EnableZipkinServer;

@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {

    public static void main(String[] args) {
        // 启动应用
        SpringApplication.run(ZipkinServerApplication.class, args);
    }

}

SpringBoot 2.2.x 以后的版本,启动会报错 zipkin2.server.internal.ZipkinHealthIndicator.<init>(ZipkinHealthIndicator.java:26)

完整报错信息如下:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-07-24 16:13:59.158 ERROR 4976 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call a method that does not exist. The attempt was made from the following location:

    zipkin2.server.internal.ZipkinHealthIndicator.<init>(ZipkinHealthIndicator.java:26)

The following method did not exist:

    org.springframework.boot.actuate.health.CompositeHealthIndicator.<init>(Lorg/springframework/boot/actuate/health/HealthAggregator;)V

The method's class, org.springframework.boot.actuate.health.CompositeHealthIndicator, is available from the following locations:

    jar:file:/D:/maven_repository/org/springframework/boot/spring-boot-actuator/2.2.13.RELEASE/spring-boot-actuator-2.2.13.RELEASE.jar!/org/springframework/boot/actuate/health/CompositeHealthIndicator.class

It was loaded from the following location:

    file:/D:/maven_repository/org/springframework/boot/spring-boot-actuator/2.2.13.RELEASE/spring-boot-actuator-2.2.13.RELEASE.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of org.springframework.boot.actuate.health.CompositeHealthIndicator

Disconnected from the target VM, address: '127.0.0.1:50399', transport: 'socket'

Process finished with exit code 1

4.页面截图

注意:默认页面上的数据是存放在内存里的,重启就会消失,如果需要持久化,可以放到 ES 或者 数据库 中。

启动页面:

在这里插入图片描述

zipkin-server 页面: http://localhost:9411

在这里插入图片描述

三、搭建 sleuth-zipkin

1.Maven 依赖

<!-- Sleuth -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<!-- Zipkin -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

2.yaml配置

server:
  port: 8081

spring:
  application:
    name: sleuth-feign-a
  zipkin:
    # zipkin-server地址
    base-url: http://localhost:9411/
  sleuth:
    sampler:
      # 采样比例,0-1 之间,1 表示全部采集
      probability: 1.0

# 用于打印更多 sleuth 日志
#logging:
#  level:
#    org.springframework.cloud.sleuth: DEBUG

3.代码实现

这里我们搭建了两个服务:sleuth-feign-asleuth-feign-b。由服务a调用服务b,完成链路调用。

DemoController.java

import com.demo.common.Result;
import com.demo.feign.DemoFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/demo")
public class DemoController {

    @Value("${server.port:}")
    private String port;

    @Autowired
    private DemoFeignClient demoFeignClient;

    @GetMapping("/test")
    public Result<Object> test() {
        String data = "This is a test! port:" + port;
        log.info(">>>>>>>>>> 【INFO】data:{}", data);
        return Result.succeed().setData(data);
    }

    @GetMapping("/feignTest")
    public Result<Object> feignTest() {
        return demoFeignClient.test();
    }
}

DemoFeignClient.java

import com.demo.common.Result;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;

@FeignClient(value = "sleuth-feign-b")
public interface DemoFeignClient {

    @GetMapping("/demo/test")
    Result<Object> test();
}

4.测试

服务启动后,请求地址:http://localhost:8081/demo/feignTest

重新访问 zipkin-server 地址:http://localhost:9411

在这里插入图片描述

我们利用日志中的 traceIdspanId 均可进行定位到该次请求:

在这里插入图片描述

在这里插入图片描述

整理完毕,完结撒花~ 🌻





参考地址:

1.Spring Boot 中的 Sleuth 是什么, 如何使用,https://blog.csdn.net/2302_77835532/article/details/131552092

2.SpringBoot集成ZipKin实现链路跟踪,https://blog.csdn.net/huxiang19851114/article/details/122976149

3.spring boot集成zipkin-server,https://blog.csdn.net/zjgxxxxxxx/article/details/126421350

4.Spring Boot中的Zipkin:分布式跟踪系统,https://blog.csdn.net/JasonXu94/article/details/131552472

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安全技术-大数据平台安全防护技术

一、大数据基本概念及背景 1.1大数据发展的背景-数据爆炸 伴随着互联⽹、物联⽹、电⼦商务、社交媒体、现代物流、⽹络⾦融等⾏业的发展&#xff0c;全球数据总量正呈⼏何级数增长&#xff0c;过去⼏年时间产⽣的数据总量超过了⼈类历史上的数据总和&#xff0c;预计2020年全…

json的序列化与反序列化

目录 json的下载 json的序列化 json的反序列化 备注json开源项目github地址&#xff1a;https://github.com/nlohmann/json 备注开发环境&#xff1a;vscode通过ssh连接虚拟机中的ubuntu&#xff0c;ubuntu-20.04.3-desktop-amd64.iso json的下载 git clone https://githu…

iptables的备份和还原

iptables的备份和还原 1、写在命令行当中的都是临时设置 2、把规则配置写在服务的文件当中&#xff0c;形成永久有效 备份&#xff1a;把iptables里面所有的配置都保存在/opt/ky30.bak中 iptables-save > /opt/ky30.bak 例&#xff1a; 默认配置文件在/etc/sysconfig/ip…

C++ const与指针

const与指针 1.const在C语言和C中的区别 &#xff08;1&#xff09;在C语言中 #include<stdio.h> int main() {const int n 10; int arr[n] { 1,2 }; //errorreturn 0; }在C语言中&#xff0c;const修饰的变量是只读变量&#xff08;常变量&#xff09;&#xff0c…

假如三国有网络安全攻防演练

东汉末年&#xff0c;天下三分&#xff0c;而奠定这一局势的战役就是历史上赫赫有名的“赤壁大战”。 作为我国以少胜多的经典战例&#xff0c;赤壁之战汇聚了三国最顶级的名臣武将&#xff0c;期间各种计谋、策略环环相扣&#xff0c;高潮迭起&#xff0c;攻守双方你方唱罢我…

【Java|golang】860. 柠檬水找零

在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品&#xff0c;&#xff08;按账单 bills 支付的顺序&#xff09;一次购买一杯。 每位顾客只买一杯柠檬水&#xff0c;然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零&#xff0c;…

AtcoderABC235场

A - Rotate A - Rotate 题目大意 题目要求给定一个3位的整数abc&#xff0c;其中每个数字都不是0。计算abc bca cab的结果。 思路分析 将a、b和c按照题目要求的顺序连接起来&#xff0c;得到字符串abc、bca和cab。将这三个字符串转换为整数&#xff0c;分别表示为变量abc…

【后端面经】微服务构架 (1-3) | 熔断:抖抖抖不停?微服务熔断策略让你的系统稳如泰山!

文章目录 一、前置知识1、什么是熔断?2、什么是限流?3、什么是降级?4、怎么判断微服务出现了问题?A、指标有哪些?B、阈值如何选择?C、超过阈值之后,要不要持续一段时间才触发熔断?5、服务恢复正常二、面试环节1、面试准备2、面试基本思路三、总结 在微服务构架中…

ModuleNotFoundError: No module named ‘transformers.models.mmbt‘

使用simpletransformers时出现ModuleNotFoundError: No module named transformers.models.mmbt’错误。 1. 报错代码&#xff1a; from simpletransformers.classification import ClassificationModel 2. 报错结果 3. 报错原因 transformers和simpletransformers版本的问…

【C语言进阶篇】数组指针都学过了那么函数指针你了解嘛?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 函数指针&#x1f4ad; 函数名 和 &函数&#x1f4ad; 函数指针的定义&am…

蕨型叶分形

目录 要点 基本语句 EraseMode 习题 1 设置颜色 2 旋转蕨型叶图 3 枝干 4 塞平斯基三角形 要点 蕨型叶是通过一个点的反复变换产生的&#xff0c;假设x是一个含有两个分量的向量&#xff0c;可以用来表示平面内的一个点&#xff0c;则可以用Axb的形式对其进行变换。 基本…

衡器关于检定分度值e和实际分度值d的一点认识

在看衡器认证的文档时有两个概念很容易混淆d(actual scale interval)和e(verification scale interval)&#xff0c;国内文档上翻译为实际分度值和检定分度值。 实际分度值(d)就是称能显示的最小刻度或最小能显示的值跨度&#xff0c;可以理解为可读精度&#xff0c;例如电子秤…

[虚幻引擎] UE里面监控每帧循环里面 C++ 函数的性能, 函数耗时,函数效率,函数执行时间

在使用C开发UE引擎&#xff0c;有时候需要监控函数的执行的执行效率&#xff0c;这个时候有两种方式可以使用。 1. 执行代码耗时时间 double ThisTime 0;{SCOPE_SECONDS_COUNTER(ThisTime);// ...// 一串代码// ...}UE_LOG(LogTemp, Log, TEXT("Stats::Broadcast %.2f&qu…

【Spring Boot】Web开发 — 数据验证

Web开发 — 数据验证 对于应用系统而言&#xff0c;任何客户端传入的数据都不是绝对安全有效的&#xff0c;这就要求我们在服务端接收到数据时也对数据的有效性进行验证&#xff0c;以确保传入的数据安全正确。接下来介绍Spring Boot是如何实现数据验证的。 1.Hibernate Vali…

mysql(三)用户权限管理

目录 前言 一、概述 二、用户权限类型 三、用户赋权 四、权限删除 五、删除用户 前言 为什么要设置用户权限&#xff1f; MySQL设置用户管理权限的主要目的是为了确保数据库的安全性和数据的机密性。以下是一些原因&#xff1a; 1. 安全性&#xff1a;MySQL是一个开源的关系型…

多线程案例 | 单例模式、阻塞队列、定时器、线程池

多线程案例 1、案例一&#xff1a;线程安全的单例模式 单例模式 单例模式是设计模式的一种 什么是设计模式&#xff1f; 设计模式好比象棋中的 “棋谱”&#xff0c;红方当头炮&#xff0c;黑方马来跳&#xff0c;针对红方的一些走法&#xff0c;黑方应招的时候有一些固定的…

【C++初阶】:模板进阶

模板进阶 一.非类型模板参数二.模板的特化1.概念2.函数模板特化3.类的特化1.全特化2.偏特化 三.模板的分离编译 一.非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类…

Play 资产分发(Play Asset Delivery)

一、前言 Google Play发布应用&#xff0c;只支持上传aab格式文件。在之前&#xff0c;Google Play对上传apk文件限制大小不超过150MB&#xff0c;对于新的aab格式文件&#xff0c;也要求生成的目标apk不超过150MB&#xff08;GooglePlay后台使用bundletool生成apk文件&#xf…

虚拟机网络桥接,详细操作步骤,本地连接虚拟机

虚拟机网络桥接 文章目录 虚拟机网络桥接一&#xff0c;首先查看主机连接网络的网关二、打开虚拟机的worksation服务三、修改主机的VMnet8的IPV4属性四、修改虚拟机的workstation的虚拟网络五、修改VMnet8的IP,网关六、把虚拟机设置为桥接模式七、修改虚拟机的静态ip和对应的网…

JAVA面试总结-Redis篇章(三)——缓存雪崩

JAVA面试总结-Redis篇章&#xff08;三&#xff09;——缓存雪崩