微服务sleuth+zipkin——链路追踪

news2024/10/7 12:27:40

一、链路追踪🍉

1.什么是链路追踪?🥝

在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。

2.为什么需要链路追踪?🥝

在大型系统的微服务化构建中,一个系统被拆分成了许多微服务。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心【区域】,也就意味着这种架构形式也会存在一些问题:

  • 如何快速发现问题?

  • 如何判断故障影响范围?

  • 如何梳理服务依赖?

  • 如何分析链路性能问题以及实时容量规划?

3.那该如何解决呢?🥝

sleuth : 链路追踪器
zipkin:链路分析器(可视化)

在这里插入图片描述

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

常见的链路追踪技术

cat 由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成

方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码的侵入性很大,集成成本较高。风险较大。

zipkin 由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微

服务架构中的延迟问题,包括:数据的收集、存储、查找和展现《图形化》。该产品结合spring-cloud-sleuth 使用较为简单, 集成很方便, 但是功能较简单。

pinpoint Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点

是支持多种插件,UI功能强大,接入端无代码侵入。

skywalking 【未来企业会使用的多】

SkyWalking是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多

种插件,UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。 —火。

Sleuth (日志记录每一条链路上的所有节点,以及这些节点所在的机器,和耗时。)log4j

SpringCloud 提供的分布式系统中链路追踪解决方案。

注意:SpringCloud alibaba技术栈中并没有提供自己的链路追踪技术的,我们可以采用Sleuth + Zipkin来做链路追踪解决方案

二、Sleuth介绍🍉

SpringCloud Sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计, 先来了解一下Sleuth中的术语和相关概念。

相关术语🥝

  • Trace (一条完整链路–包含很多span(微服务接口))
    由一组Trace Id(贯穿整个链路)相同的Span串联形成一个树状结构。为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要服务跟踪框架为该请求创建一个唯一的标识(即TraceId),同时在分布式系统内部流转的时候,框架始终保持传递该唯一值,直到整个请求的返回。那么我们就可以使用该唯一标识将所有的请求串联起来,形成一条完整的请求链路。
  • Span
    代表了一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个服务组件的时候,也通过一个唯一标识(SpanId)来标记它的开始、具体过程和结束。通过SpanId的开始和结束时间戳,就能统计该span的调用时间,除此之外,我们还可以获取如事件的名称。请求信息等元数据。
  • Annotation
    用它记录一段时间内的事件,内部使用的重要注释:

cs(Client Send)客户端发出请求,开始一个请求的生命

sr(Server Received)服务端接受到请求开始进行处理, sr-cs = 网络延迟(服务调用的时间)
ss(Server Send)服务端处理完毕准备发送到客户端,ss - sr = 服务器上的请求处理时间

cr(Client Reveived)客户端接受到服务端的响应,请求结束。 cr - sr = 请求的总时间

使用sleuth🥝

记录微服务日志。

(1)引入依赖🍓

在父工程中引入
在这里插入图片描述

 <!--sleuth  路径追踪依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-sleuth</artifactId>
    </dependency>

(2)测试🍓

启动效果
在这里插入图片描述
在这里插入图片描述
调用链路中他们具有相同的traceId,每个模块都有自己的spanId. 这样sleuth会被这些相同traceId的spanId串联起来形成一个完整的调用链路。 如何想只要每个spanId的执行时间,可以通过日志的时间进行减操作。如果这样看非常麻烦。----有没有一个组件用来搜集sleuth生成的日志,并以图形化展示。—zipkin

三、Zipkin介绍🍉

ZipKin介绍🥝

Zipkin 是 Twitter 的一个开源项目,它基于Google Dapper实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储展现、查找和我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源,除了面向开发的 API 接口之外,它也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比如:可以查询某段时间内各用户请求的处理时间等。
Zipkin 提供了可插拔数据存储方式:In-Memory、MySql、Cassandra 以及 Elasticsearch。

在这里插入图片描述

使用Zipkin🥝

第一件事: 搭建zipkin服务器🍓

下载地址:https://repo1.maven.org/maven2/io/zipkin/zipkin-server/
在这里插入图片描述
在cmd命令窗口中输入命令

//启动zipkin服务器
java -jar zipkin***.jar

在这里插入图片描述

第二件事: 指定微服务所用的zipkin服务器地址。🍓

(1)需要在微服务中引入zipkin依赖

在这里插入图片描述

 <!--zipkin 图形化界面依赖-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-zipkin</artifactId>
    </dependency>

(2)在每个微服务中指定zipkin服务端的地址

在这里插入图片描述

在这里插入图片描述

#指定zipkin服务器的地址
spring.zipkin.base-url=http://localhost:9411/

缺点:当zipkin重启后,链路也会丢失。 默认存在在内存中。

保证mysql数据库允许远程连接

将zipkin持久化到数据库🍓

1.需要在数据库中创建zipkin库以及相关表结构

在这里插入图片描述

CREATE DATABASE `zipkin` /*!40100 DEFAULT CHARACTER SET utf8 */;
use zipkin;
 
CREATE TABLE IF NOT EXISTS zipkin_spans (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL,
  `id` BIGINT NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `remote_service_name` VARCHAR(255),
  `parent_id` BIGINT,
  `debug` BIT(1),
  `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
  `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
  PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
 
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
 
CREATE TABLE IF NOT EXISTS zipkin_annotations (
  `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
  `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
  `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
  `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
  `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
  `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
  `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
  `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
  `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
  `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
 
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
 
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
  `day` DATE NOT NULL,
  `parent` VARCHAR(255) NOT NULL,
  `child` VARCHAR(255) NOT NULL,
  `call_count` BIGINT,
  `error_count` BIGINT,
  PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;

2.重新启动zipkin服务器

java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=172.16.7.83 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=123456

在这里插入图片描述
如果数据库版本是8.0以上需要更改数据库环境否则运行会报错

在这里插入图片描述
需要登录mysql数据库更改校验标准

在这里插入图片描述

USE mysql;
//''里的<password>换成自己需要更改的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '<password>';

FLUSH PRIVILEGES;

select user,host,plugin from user;

测试结果

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

深入理解Java虚拟机(二)Java内存区域与内存溢出异常

一、前言 对于Java程序员来说&#xff0c;在虚拟机自动内存管理机制的帮助下&#xff0c;不再需要为每一个new操作去写配对的delete/free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;看起来由虚拟机管理内存一切都很美好。不过&#xff0c;也正是因为Java程序…

IEC 103/104

IEC101 串口通信 串口远动协议 控制区和数据区&#xff0c;(信息体地址&#xff0c;装置地址等) IEC102 电量采集 IEC103 保护设备的通信 串口 实时监测 各种故障 103协议就是用来保护装置和后台监控进行通信的。 IEC104 调度自动化系统、厂站之间的通讯 网络 帧里面多了…

Ansible Playbook剧本配置文件

一、执行文件 Playbook配置文件使用YAML语法&#xff0c;具有简 洁明了&#xff0c;结构清晰等特点。Playbook配置文件类似于shell脚本&#xff0c;是一个YAML格式的文件&#xff0c;用于保存针对特定需求的任务列表&#xff0c;前面介绍的ansible命令虽然可以完成各种任务&a…

学习记录——SAM、SPM

Segment Anything Model&#xff08;SAM&#xff09; 能分割一切的模型 2023 SAM是一个提示型模型&#xff0c;其在1100万张图像上训练了超过10亿个掩码&#xff0c;实现了强大的零样本泛化。许多研究人员认为「这是 CV 的 GPT-3 时刻&#xff0c;因为 SAM 已经学会了物体是什…

EFLFK——ELK日志分析系统+kafka+filebeat架构(有乌云的天反而是最美的)

文章目录 1.修改filebeat配置文件filebeat.yml收集日志转发&#xff08;生产&#xff09;给kafka2.修改logstash配置从kafka中消费日志&#xff0c;并输出到kibana前端展示 在ELFK的基础上&#xff0c;添加kafka做数据缓冲 附kafka消息队列 nginx服务器配置filebeat收集日志&am…

appium自动化测试中控件坐标及控件属性获取

在appium有时会遇到content-desc中存在内容的情况&#xff0c;有时需要校验它的值&#xff0c;那么它是怎么获取的呢&#xff1f; driver.find_element_by_XX().get_attribute("contentDescription") 使用上边的方式可以获取到content-desc中的值。 像上图中我们其…

《3.linux应用编程和网络编程-第9部分-3.9.linux网络编程实践》3.9.6_7.soekct实践编程1_2

概念&#xff1a;端口号&#xff0c;实质就是一个数字编号&#xff0c;用来在我们一台主机中&#xff08;主机的操作系统中&#xff09;唯一的标识一个能上网的进程。端口号和IP地址一起会被打包到当前进程发出或者接收到的每一个数据包中。每一个数据包将来在网络上传递的时候…

人工智能顶会投稿截止时间汇总

一、NeurIPS 1. 会议名称及等级 Annual Conference on Neural Information Processing Systems&#xff08;CCF-A&#xff09;https://dblp.uni-trier.de/db/conf/nips/index.html 2. 投稿时间及接收率 https://neurips.cc/Conferences/2023/CallForPapers#OpenReview 一般…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…

linux kernel单独编译某项驱动

linux内核经常涉及编译某一项驱动代码的场景&#xff0c;本次以网卡驱动e1000为例说明整个步骤流程。 首先编译内核驱动不必要编译整个内核&#xff0c;但编译的驱动代码必须要和要安装的内核版本保持一致&#xff0c;否则经常会出现无法加载模块。 在编译驱动前&#xff0c;最…

2023年上半年系统集成项目管理工程师成绩什么时候出

一般是考后30个工作日左右&#xff0c;即2023年7月中下旬出成绩的概率比较大&#xff0c;只能耐心等待了&#xff0c;届时软考办官网会发布成绩查询通知。 注意&#xff01;&#xff01;2023年上半年系统集成项目管理工程师成绩查询方法跟以前有点区别&#xff1a; 以前&…

C++入门学习(1)

一&#xff0c;我的第一个C程序 代码&#xff1a; #include<iostream> using namespace std; int main() {cout << "hello world" << endl; } 这是我写的第一篇关于C的博客&#xff0c;上面的程序也是我写的第一个C程序。对于用惯了C语言的我来说…

【GlobalMapper精品教程】062:基于DEM制作仿地飞行DSM文件(适用于精灵4RTK)

仿地飞行指的是无人机根据获取的地形数据调整飞行高度,保持对地的恒定高差。目前,主要有实时仿地、导入高程(高度)数据仿地两种仿地飞行方式。本文讲解基于DEM数字高程模型进行仿地DSM高程文件制作的方案。 文章目录 一、确定外业范围二、下载准备DEM三、仿地DSM制作1. 裁剪…

python VTK vtkImplicitBoolean 布尔切割

VTK中包含可以执行布尔操作的接口有vtkImplicitBoolean&#xff0c;vtkBooleanOperationPolyDataFilter&#xff0c;vtkLoopBooleanPolyDataFilter。 布尔操作包括&#xff1a;布尔加&#xff0c;布尔减和布尔交。 code: #!/usr/bin/env python""" This examp…

不是吧?强大的 vite 居然不支持内 SVG 转 Base64 内嵌?

大家好&#xff0c;我是前端西瓜哥。 诶哟喂&#xff0c;SVG 怎么没内嵌&#xff1f; 最近啊&#xff0c;西瓜哥我用 vite 去给一个项目构建&#xff08;vite build&#xff09;一个应用。打包结果是一个 html 和一些加了哈希的资源。 然后打包出来的文件一看&#xff0c;发…

SpringCloud学习路线(3)—— Eureka注册中心

一、导引 服务调用出现的问题 服务调用采取的请求地址是静态的&#xff0c;当我们使用服务集群时&#xff0c;很容易造成只能调用固定的微服务上的接口。多个提供者&#xff0c;消费者的使用对象无法确定消费者无法得知提供者的状态 二、Eureka注册中心 &#xff08;一&…

加水印用什么软件你知道吗?告诉你加水印的app哪个好用吧

笑笑是一个热爱生活的女孩&#xff0c;她经常会随手拍下生活的瞬间&#xff0c;并且在社交媒体上分享自己的开心时刻。然而&#xff0c;最近她发现自己的照片被未经授权地使用在其他网站和博客上。这让她感到非常生气。为了保护自己的作品权益&#xff0c;她决定寻找一个好用的…

vue3 h函数使用图文教程

序&#xff1a; 1、官方文档地址》渲染函数 & JSX | Vue.js 2、博主微信公众号&#xff1a;“程序员野区”&#xff0c;关注公众号回复“加群&#xff0c;可以进到博主微信群 正文&#xff1a; 别恐惧啊&#xff0c;别一看官方api那边标注的 是进阶api就跳过去&#xff0c…

1ll大学学生信息管理系统系统_学院管理_查询新增或修改删除标准接口_

目录 修订版本 1. 目的 2. 阅读人员 3. 参考文档 ll大学学生信息管理系统系统_学院管理_查询新增或修改删除标准接口 4.1 接口概述 4.2 接口名称 4.3查询学院信息接口标准 4.4新增学院信息接口标准 4.5修改学院信息接口标准 学生信息管理系统系统_学院管理_查询新增或…

【unity细节】分不清楚__世界坐标,自身坐标,Vector3,transform和translate?

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐世界坐标系transform和自身坐标Trasform.local和Vector3⭐ 文章目录 ⭐世界坐标…