服务链路追踪 —— SpringCloud Sleuth
Sleuth 简介
随着业务的发展,系统规模变得越来越大,微服务拆分越来越细,各微服务间的调用关系也越来越复杂。客户端请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,几平每一个请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败
这时需要一个能够监控微服务整个调用链的工具,跟踪一个用户请求的全过程(包括数据采集、数据传输、数据存储、数据分析、数据可视化),捕获这些跟踪数据,构建微服务整个调用链的视图,Spring Cloud Sleuth 就是这样一个工具
服务追踪系统的实现主要包括三个部分:
- 埋点数据收集:负责在服务端进行埋点,以收集服务调用的上下文数据
- 实时数据处理:负责将收集到的链路信息按照 Traccld 和 Spanld 进行串联和存储
- 数据链路展示:把处理后的服务调用数据按照调用链的形式展示出来
下面我们再来看一下 Sleuth 的核心概念
- Trace:一组 Span 的集合,表示一条调用链路,例如,服务 A 调用服务 B,再调用服务 C,A-B-C 链路就是一条 Trace,每个服务(例如 B)就是一个Span,如果在服务 B 中再加入两个线程,分别调用了 D、E,那么 D、E 就是 B 的子 Span
- TraceId:全局跟踪 ID,用来标记一次完整服务调用,所以一次服务调用相关的 Span 的 Traceld 都是相同的
- Span:基本工作单元,通过 64 位 ID 唯一标识,Span 还包含其他数据信息,比如摘要、时间藏事件、关键值注释 (tags)、Span 的 ID 以及进度 ID(通常是 IP 地址)
- Id:Span 的 ID,只要做到一个 Traceld 下唯一即可
- Parentld:父 Span 的 ID,调用有层级关系,所以 Span 作为调用节点的存储结构,也有层级关系
- Annotation:基本标注列表,用来及时记录一个事件的存在,一个标注可以理解成 Span 生命周期中重要时刻的数据快照,比如一个标注中一般包含发生时刻(timestamp)、事件类型(value)、端点(endpoint)等信息,事件类型包括以下几种:
- cs(Clien Sent):客户端发起一个请求,这个 Annotion 注解描述 Span 的开始
- sr(ServerReceived):服务端获得请求并准备开始处理它,sr 减去 cs 即网络延迟时间
- ss(Server Sent):表明请求处理的完成(请求返回客户端),ss 减去 sr 即服务端需要的处理请求时间
- cr(Client Received):表明 Span 的结束,客户端成功接收到服务端的回复,cr 减去 cs 即客户端从服务端获取回复的所有时间
ZipKin 简介
Zipkin 是一个开源的分布式追踪系统,用于对服务间的调用链路进行监控追踪。在微服务架购下,用户的一个请求可能涉及很多个后台服务间的调用。Zipkin 可以追踪(trace)调用链路、收集在各个微服务上所花的时间等信息,并上报到 Zipkin 服务器
Zipkin 提供可插拔数据存储方式:In-Memory、MySQL、Cassandra 以及 Elasticsearch,为了方便在开发环境直接采用 In-Memory 方式进行存储,生产数据量大的情况则推荐使用 Elasticsearch
Zipkin 主要由四个核心组件组成:
- Collector:接收或收集各应用传输的数据
- Storage:存储接收或收集过来的数据,当前支持 Memory、MySQL、Cassandra、ElasticSearch 等,默认存储在内存中
- API(Query):负责查询 Storage 中存储的数据,提供简单的 JSON API 获取数据,主要提供给 Web UI 使用
- UI:官方默认提供的一个图形用户界面
Zipkin 以 Trace 结构表示对一次请求的追踪,把每个 Trace 拆分为若于个有依赖关系的 Span,可以把每个处理请求的服务理解为一个 Span。Zipkin 除了可以查看 Span 的依赖关系之外,还以瀑布图的形式显示每个 Span 的耗时情况,可以清晰地看到各个服务的性能状况。打开每个 Span,还有更详细的数据以键值对的形式呈现,而且这些数据可以在装备应用的时候自行添加
Zipkin 下载地址:https://repo1.maven.org/maven2/io/zipkin/zipkin-server/
这里选择 zipkin-server-2.24.3-exec.jar 版本,既然是一个 jar 包,那么直接使用 java 命令运行即可,访问:http://localhost:9411/zipkin/ 可查看控制台
如果使用 MySQL 进行数据存储,需要事先搭建好 MySQL 数据库,执行建表脚本,可在 GitHub 获取:https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql
启动 ZipKin,连接 MySQL,具体启动命令如下:
java -jar .\zipkin-server-2.24.3-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=test_db --MYSQL_USER=root --MYSQL_PASS=123
Spring Cloud Sleuth 整合 ZipKin
在 server-01 和 server-02 项目分别添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
在 server-01 和 server-02 项目分别添加配置
spring:
zipkin:
base-url: http://localhost:9411
enabled: true
sleuth:
enabled: true
如果 spring-cloud-sleuth-zipkin 位于类路径中,则该应用程序会生成并收集与 Zipkin 兼容的 Trace,默认情况下,应用程序通过 HTTP 将 ace 信息发送到本地主机(端口 9411)上的 ZipKin 服务器,可以通过设置 spring.zipkin.base-url 来配置服务的地址
在 server-01 使用 Feign 调用 server-02 接口
// server-01
@Slf4j
@RestController
public class TestCon {
@Autowired
private Server02FeignClient server02FeignClient;
@GetMapping("/test/getConfigByFeign")
public void getConfigByFeign() {
server02FeignClient.getConfig();
}
}
// server-02
@Slf4j
@RestController
public class TestCon {
@Value("${test.value}")
private String testValue;
@Value("${spring.application.name}")
private String applicationName;
@Value("${server.port}")
private String port;
@GetMapping("/test/getConfig")
public void getConfig() {
log.info("testValue: {} by {}-{}", testValue, applicationName, port);
}
}
查看 ZipKin 控制台,选择 Dependencies 选项卡,点击 RUN QUERY 查看具体请求链路,选择 Find a trace 选项卡,单击 RUN QUERY,可查看具体的请求信息
服务链路追踪 —— SpringCloud Sleuth的更多相关文章
- 服务链路追踪(Spring Cloud Sleuth)
sleuth:英 [slu:θ] 美 [sluθ] n.足迹,警犬,侦探vi.做侦探 微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元.由于服务单元数量众多,业务的 ...
- spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪
好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...
- Spring Cloud Sleuth+ZipKin+ELK服务链路追踪(七)
序言 sleuth是spring cloud的分布式跟踪工具,主要记录链路调用数据,本身只支持内存存储,在业务量大的场景下,为拉提升系统性能也可通过http传输数据,也可换做rabbit或者kafka ...
- springCloud的使用08-----服务链路追踪(sleuth+zipkin)
sleuth主要功能是在分布式系统中提供追踪解决方案,并且兼容支持了zipkin(提供了链路追踪的可视化功能) zipkin原理:在服务调用的请求和响应中加入ID,表明上下游请求的关系. 利用这些信息 ...
- Spring Cloud 整合分布式链路追踪系统Sleuth和ZipKin实战,分析系统瓶颈
导读 微服务架构中,是否遇到过这种情况,服务间调用链过长,导致性能迟迟上不去,不知道哪里出问题了,巴拉巴拉....,回归正题,今天我们使用SpringCloud组件,来分析一下微服务架构中系统调用的瓶 ...
- 分布式链路追踪系统Sleuth和ZipKin
1.微服务下的链路追踪讲解和重要性 简介:讲解什么是分布式链路追踪系统,及使用好处 进行日志埋点,各微服务追踪. 2.SpringCloud的链路追踪组件Sleuth 1.官方文档 http://cl ...
- spring cloud链路追踪组件sleuth和zipkin
spring cloud链路追踪组件sleuth 主要作用就是日志埋点 操作方法 1.增加依赖 <dependency> <groupId& ...
- Gokit微服务-服务链路追踪
https://mp.weixin.qq.com/s/gjKOy4SDpsjUXDC3Q1YdFw Gokit微服务-服务链路追踪 原创: 兮一昂吧 兮一昂吧 2月28日
- SpringCloud(7)服务链路追踪Spring Cloud Sleuth
1.简介 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可.本文主要讲述服务追踪组件zipki ...
- springCloud学习-服务链路追踪(Spring Cloud Sleuth)
1.简介 Spring Cloud Sleuth 是 Spring Cloud 的一个组件,它的主要功能是在分布式系统中提供服务链路追踪的解决方案. 常见的链路追踪组件有 Google 的 Dappe ...
随机推荐
- AI与健康管理:趋势与未来
目录 引言 随着人工智能技术的不断发展,健康管理也逐渐成为了一个新的研究领域.AI技术可以为健康管理提供智能化.个性化.高效的支持,使得健康管理更加人性化和科学.本文将介绍AI与健康管理的技术原理.实 ...
- RLHF技术在智能金融中的应用:提高金融智能化和自动化水平”
目录 引言 随着人工智能技术的不断发展和普及,金融智能化和自动化水平也得到了显著提高.在这个时代,RLHF(Reinforcement Learning with Human Feedback)技术已 ...
- Python常用基础知识整理
一.Python转义字符 \a :响铃(BEL) \b : 退格(BS) ,将当前位置移到前一列 \f :换页(FF),将当前位置移到下页开头 \n :换行(LF) ,将当前位置移到下一行开头 \r ...
- .Net下验证MongoDB 的 Linq 模式联合查询是否可用
MongoDB.Driver 类库提供了 Linq 查询的支持.然而,在使用 Linq 进行联合查询时,是否能够正确转换为 MongoDB 底层的查询语句还有待验证.今天,我将进行实验来验证一下. 输 ...
- github上传文件报错failed to push some refs解决
报错内容,不能推送文件到github上 error: failed to push some refs to github地址 原因是github项目与本地文件夹一些关键文件的确实,比如.git,re ...
- PTA 21级数据结构与算法实验6—图论
目录 7-1 邻接矩阵表示法创建无向图 7-2 邻接表创建无向图 7-3 图深度优先遍历 7-4 单源最短路径 7-5 列出连通集 7-6 哈利·波特的考试 7-7 家庭房产 7-8 森森美图 7-9 ...
- PerfView 洞察C#托管堆内存 "黑洞现象"
一:背景 1. 讲故事 首先声明的是这个 黑洞 是我定义的术语,它是用来表示 内存吞噬 的一种现象,何为 内存吞噬,我们来看一张图. 从上面的 卦象图 来看,GCHeap 的 Allocated=85 ...
- 王道oj/problem7(判断数字是否为对称数)
网址:http://oj.lgwenda.com/problem/7 思路:用temp保存原数: 不断对原数进行/10及取余运算,并加到num2中: 最后判断num2是否与temp相等. 代码: #d ...
- tensorflow-2.7-M1-安装依赖openblas问题
问题描述 安装过程 conda create -n conda-forge-tensorflow conda-forge::tensorflow conda info -e conda activat ...
- redis集群:MASTER aborted replication with an error: NOAUTH Authentication required.
发现个问题:redis集群所在服务器,磁盘空间很快就被占满,使用 "du -sh *"查看每个文件夹的大小,发现redis集群三个从节点的日志文件占用空间很大. 下面记录问题排查及 ...