六、链路追踪

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

  • 如何快速发现问题?
  • 如何判断故障影响范围?
  • 如何树立服务依赖以及依赖的合理性?
  • 符合拆分链路性能问题以及实时容量规划?

6.1 链路追踪介绍

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

6.2 常用的链路追踪技术

6.2.1 cat

由大众点评开源,基于java开发的实时应用监控平台,包括实时应用监控、业务监控、集成方案是通过代码买点的方式来实现监控,比如:拦截器,过滤器等。对待吗的侵入性很大,集成成本较高。风险较大。

6.2.2 zipkin

由Twitter公司开源,开发源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。该产品结合spring-cloud-sleuth使用较为简单,
集成很方便,但是功能较简单。我们可以用它来手机各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并
找出系统性能瓶颈的根源。处理面向开发的API接口外,也提供了方便的UI组件来帮助我们直观的搜索跟踪信息和分析请求链路明细。如查询某段时间内个用户请求的处理时间等。提供了可插拔数据存储方式:In-Memory、MySQL、Cassandra以及Elasticsearch

6.2.3 sleuth

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

6.3 sleuth入门

6.3.1 sleuth介绍

SpringCloud sleuth主要功能就是在分布式系统中提供追踪解决方案。它大量借用了Google Dapper的设计,有如下相关术语:

  • Trace

由一组TraceId相同的Span串联形成的一个树状结构为了实现请求跟踪,当请求到达分布式系统的入口端点时,只需要跟踪框架为该请求创建的一个唯一标识(TraceId).同时在分布式系统内部流转时,框架
始终保持传递该唯一值,知道整个请求的返回,那么我们就可以使用该唯一标识将所有请求串联起来,形成一条完整的请求链路

  • Span

代表一组基本的工作单元。为了统计各处理单元的延迟,当请求到达各个微服务组件的时候,也通过一个唯一表示(SpanId)来标识它的开始、具体过程和结束。通过SpanId的开始和结束时间戳,酒桶统计该span的调用时间。
除此外还可以获取如事件的名称、请求信息等元数据

  • Annotation

用它记录一段时间内的时间,内部使用的重要注释

  • cs(Client Send): 客户端发出请求
  • sr(Server Received): 服务端接收到请求开始进行处理,sr-cs=网络延迟(服务调用的时间)
  • ss(Server Send): 服务端处理完毕准备发送到客户端,ss-sr=服务器上的请求处理时间
  • cr(Client Received) 客户端接收到服务端的响应,请求结束。cr-sr=请求的总时间

6.3.2 sleuth入门案列

  1. 父工程中添加依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId><version>2.2.1.RELEASE</version></dependency>
</dependencies>
  1. 启动微服务,调用后再控制台查看sleuth的日志输出

6.4 zipkin集成

6.4.1 ZipKin介绍

上图展示了Zipkin的基础架构,主要由四个核心组件构成

  • Collector: 收集器组件,主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为ZipKin内部处理的Span格式。以支持后续的存储、分析、展示等功能
  • Storage: 存储组件,主要对处理收集器收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
  • RESTFul API: API组件,主要用来给外部提供访问接口。如给客户端展示跟踪信息,或是外界系统访问以实现监控等
  • Web UI: 基于API组件实现的上层应用。通过UI组件用户可以方便而又直观地查询好分析跟踪信息

ZipKin分为两段,一个是ZipKin服务端,一个是客户端,客户端也就是微服务的应用。客户端会配置服务端的URL地址,一旦发生服务间的调用时,会被配置在微服务里的Sleuth的监听器监听,并生成相应的Trace和Span信息发给服务端

6.4.2 ZipKin服务端安装

  1. 下载ZipKin的jar包
    下载ZipKin.jar

  2. 通过命令行,输入一下命令启动ZipKin Server

java -jar zipkin-server-2.23.16-exec.jar

  1. 打开浏览器,访问localhost:9411

6.4.3 ZipKin客户端配置

ZipKin客户端和Sleuth的集成非常简单,只需要在微服务中添加其依赖和配置即可。

  1. 在父工程中添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId><version>2.2.1.RELEASE</version>
</dependency>
  1. 在每个微服务的application.yml中添加配置
spring:zipkin:base-url: http://localhost:9411/ # zipkin server的请求地址discovery-client-enabled: false # 让nacos把他当成URL,而不是服务名sleuth:sampler:probability: 1.0 # 采样百分比
  1. 访问微服务后再查看webUI

6.5 zipkin数据持久化

Zipkin Server默认会将追踪数据信息保存到内存中,一旦服务重启后信息会丢失,因此并不适用于生产环境。ZipKin支持将追踪数据持久化到MySQL或elasticsearch中

6.5.1 使用MySQL实现数据持久化

  1. 创建MySQL表
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 = InnoDBROW_FORMAT = COMPRESSEDCHARACTER SET = utf8COLLATE utf8_general_ci;ALTER TABLE zipkin_spansADD INDEX (`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spansADD INDEX (`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spansADD INDEX (`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spansADD 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 = InnoDBROW_FORMAT = COMPRESSEDCHARACTER SET = utf8COLLATE utf8_general_ci;ALTER TABLE zipkin_annotationsADD UNIQUE KEY (`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotationsADD INDEX (`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotationsADD INDEX (`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotationsADD INDEX (`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotationsADD INDEX (`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotationsADD INDEX (`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotationsADD 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 = InnoDBROW_FORMAT = COMPRESSEDCHARACTER SET = utf8COLLATE utf8_general_ci;
  1. 在启动ZipKin Server的时候,指定数据保存到MySQL的信息

java -jar zipkin-server-2.23.16-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=spring-cloud-alibaba --MYSQL_USER=root --MYSQL_PASS=123456

6.5.2 使用elasticsearch实现数据持久化

  1. 下载elasticsearch
    下载地址

  2. 进入下载目录的bin,启动es

  3. 启动zipkin server是指定数据保存的elasticsearch信息

java -jar zipkin-server-2.23.16-exec.jar --STORAGE_TYPE=elasticsearch --ES_HOST=localhost:9200

SpringCloud Alibaba学习06-链路追踪相关推荐

  1. 微服务实战系列之SpringCloud Alibaba学习(四)

    微服务实战系列之SpringCloud Alibaba: 微服务实战系列之SpringCloud Alibaba学习(一) 微服务实战系列之SpringCloud Alibaba学习(二) 微服务实战 ...

  2. SpringCloud Alibaba 学习圣经,10万字实现 SpringCloud 自由

    40岁老架构师尼恩的掏心窝: 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群中(50+),很多小伙伴凭借 "左手云原生+右手大数据 +SpringCloud Ali ...

  3. SpringCloud Alibaba 学习

    SpringCloud Alibaba 学习 SpringCloud Nacos Config 配置中心 第一步:git上下载nacos源码. # 下载源码 git clone https://git ...

  4. SpringCloud Sleuth分布式请求链路追踪

    概念 1. 为什么需要链路追踪? 在微服务框架中,一个由客户端发起的请求在后端系统中 会经过多个不同的的服务节点调用来协同产生最后的请求结果, 每一个前段请求都会形成一复杂的分布式服务调用链路, 链路 ...

  5. SpringCloud微服务-----skywalking链路追踪

    微服务架构已经是一个很通用的系统架构,常见的技术栈如下图所示,这张架构图基本涵括了当前微服务体系下的各种技术栈,可能不同的技术栈有不同的开源实现. 链路追踪介绍 对于一个大型的几十个,几百个微服务构成 ...

  6. springcloud使用zipkin实现链路追踪与监控

    微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单元,一个请求往往会有很多个单元参与,一旦请求出现异常,想要去定位问题点真心不容易,因此需要有个东西去跟踪请求链 ...

  7. springcloud 2.0 服务链路追踪踩坑以及一些小小的理解

    在微服务系统中,随着业务的发展,系统会变得越来越大,这样一来各个服务之间的调用关系也就变得越来越复杂.一个 HTTP 请求会调用多个不同的服务接口来处理返回最后的结果,在这个调用过程中,可能会因为某个 ...

  8. (九)企业分布式微服务云SpringCloud SpringBoot mybatis-服务链路追踪(Spring Cloud Sleuth)...

    这篇文章主要讲述服务追踪组件zipkin,Spring Cloud Sleuth集成了zipkin组件. 一.简介 Add sleuth to the classpath of a Spring Bo ...

  9. springcloud 链路追踪_Spring Cloud学习笔记

    spring cloud提供了一套完整的微服务架构,主要包括服务发现与治理,负载均衡,服务容错,服务调用框架,网关,配置中心,消息总线及消息驱动框架,健康检查与服务跟踪等模块. 下面这个系列,我将对每 ...

最新文章

  1. python中各操作符的优先级_在Python中实现操作符优先级的一般方法是什么
  2. 服务器文件嗅探,嗅探TFTP配置文件传输
  3. 由VMWorld2010想到的Social Media宣传
  4. pythonlocust使用方法_使用python的locust库进行性能测试
  5. 用IIS配置反向代理
  6. (9)数据结构-双端队列
  7. 一个词三个功能,较真人员少啊
  8. 在Win10上安装VC6
  9. hive计算几个月的最大最小时一定要把string类型转换成int类型
  10. 朱丹老师课程学习笔记:1、信息搜索-全面快速查找全网中你想要的任何信息
  11. 和平精英分数计算机制,和平精英掉分机制怎么计算
  12. vba中将数字数据转为数字格式_通过VBA将文本格式的时间转换为数字格式
  13. 删除无效的“设备和驱动器”
  14. iPS细胞的最新应用
  15. 关于音频工作站的一些事儿
  16. jnz和djnz_第3章单片机指令系统_练习
  17. 闵行区科技小巨人工程申请条件及奖励政策解读
  18. 与你同行之Axure技能:认识界面
  19. android 获取当前系统选择的语言
  20. 美颜sdk磨皮与瘦脸功能代码分析

热门文章

  1. 平面广告公司电脑应用配置需求分析
  2. 用python实现给人脸带圣诞帽子
  3. 乐观者和悲观者的成功密码
  4. oracle数据库下载免费下载,oracle数据库下载地址
  5. iQOO Z7和iQOO Z7x区别 参数对比评测
  6. 勒索软件攻击防御的9件事
  7. 冥王星轨道发现不明生命 全世界都惊呆了
  8. Google浏览器无法访问本地图片问题解决
  9. 如何把纸质版试卷扫描成电子版?快来试试这三个软件
  10. 联想拯救者 Ubuntu 20.04 Nvidia GTX1650 显卡驱动安装问题解决