链路追踪

  • 一、概念
    • 1.1 链路追踪
    • 1.2 各种系统
  • 二、重要概念
  • 三、实现(sleuth+zipkin)
    • sleuth
      • 1.概念
      • 2.依赖和配置
    • zipkin
      • 1.概念
      • 2.zipkin架构图
      • 2.使用
        • Zipkin Server
        • Zipkin Client
  • 问题和优化
    • 问题
    • 优化

一、概念

1.1 链路追踪

用户->网关->A->B->C->D

分布式系统中一次调用会非常的复杂。我们需要更好的发现问题,定位问题是在哪个微服务中出现的。分析在各个定义节点的耗时确认性能瓶颈等。

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

1.2 各种系统

目前业界比较流行的链路追踪系统如:Twitter的Zipkin,阿里的鹰眼,美团的Mtrace,大众点评的
cat等,大部分都是基于google发表的Dapper。Dapper阐述了分布式系统,特别是微服务架构中链路
追踪的概念、数据表示、埋点、传递、收集、存储与展示等技术细节。

二、重要概念

trace 整个调用链路

完整的一次调用,比如用户A->网关->B->C 可以定义为 traceid:1

span 最小的工作单元(链路中的一个节点的调用)

用户A->网关 spanid:1

网关->B spanid:2

B->C spanid:3

三、实现(sleuth+zipkin)

sleuth

1.概念

Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只
需要在pom文件中引入相应的依赖即可。

2.依赖和配置

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId></dependency>
logging:level:root: INFOorg.springframework.web.servlet.DispatcherServlet: DEBUGorg.springframework.cloud.sleuth: DEBUG

zipkin

1.概念

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

主要是收集链路追踪的日志然后进行存储展示等功能

2.zipkin架构图

Collector:收集器组件,它主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为

Zipkin 内部处理的 Span 格式,以支持后续的存储、分析、展示等功能。

Storage:存储组件,它主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,

我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。

RESTful API:API 组件,它主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接

系统访问以实现监控等。

Web UI:UI 组件,基于 API 组件实现的上层应用。通过 UI 组件用户可以方便而有直观地查询和

分析跟踪信息。

每个被追踪的微服务作为zipkin客户端,收集数据处理数据的是zipkin的服务端

2.使用

Zipkin Server

从spring boot 2.0开始,官方就不再支持使用自建Zipkin Server的方式进行服务链路追踪,而是直接提
供了编译好的 jar 包来给我们使用。可以从官方网站下载先下载Zipkin的web UI,我们这里下载的是
zipkin-server-2.12.9-exec.jar

启动命令

在命令行输入 java -jar zipkin-server-2.12.9-exec.jar 启动 Zipkin Server

默认Zipkin Server的请求端口为 9411

下载地址

https://github.com/openzipkin/zipkin/blob/master/zipkin-server/src/main/resources/zipkin-server-shared.yml

Zipkin Client

依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency>
spring:zipkin:base-url: http://127.0.0.1:9411/ #zipkin server的请求地址sender:type: web #请求方式,默认以http的方式向zipkin server发送追踪数据sleuth:sampler:probability: 1.0 #采样的百分比 生产环境中不用1.0

问题和优化

问题

1.http请求和fegin调用的时候,会出现问题(源码级别)

2.放入内存中,关闭了就没了

优化

使用rabbitmq发生和接收日志

Server

启动 Zipkin Server时指定rabbitmq地址和用户密码信息

java -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=127.0.0.1:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guestjava -jar zipkin-server-2.12.9-exec.jar --RABBIT_ADDRESSES=192.168.200.128:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guest

Client

依赖

<dependency>
<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
</dependency>

配置rabbitmq相关信息

spring:zipkin:base-url: http://127.0.0.1:9411/ #zipkin server的请求地址sender:type: rabbit #请求方式,默认以http的方式向zipkin server发送追踪数据rabbitmq:host: 192.168.200.128 #自己rabbitmq的ip地址port: 5672username: guest password: guestlistener:direct:retry:enabled: truesimple:retry:enabled: true

数据存储到mysql

创建数据库表

创建数据库zipkin 然后执行下面的sqlCREATE 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,
`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'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE
utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`)
COMMENT 'ignore insert on duplicate';ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`)
COMMENT 'for joining with zipkin_annotations';  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(`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';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces';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  ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE
utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`);

启动 Zipkin Server时指定mysql相关信息

只吧数据存储到mysql的启动命令,里面没有配置rabbit的信息java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --
MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root -
-MYSQL_PASS=111111
STORAGE_TYPE : 存储类型
MYSQL_HOST: mysql主机地址
MYSQL_TCP_PORT:mysql端口
MYSQL_DB: mysql数据库名称
MYSQL_USER:mysql用户名
MYSQL_PASS :mysql密码java -jar zipkin-server-2.12.9-exec.jar --STORAGE_TYPE=mysql --MYSQL_HOST=127.0.0.1 --MYSQL_TCP_PORT=3306 --MYSQL_DB=zipkin --MYSQL_USER=root --MYSQL_PASS=root --RABBIT_ADDRESSES=192.168.200.128:5672 --RABBIT_USER=guest --RABBIT_PASSWORD=guest

Spring Cloud 链路追踪相关推荐

  1. Spring Cloud —— 链路追踪技术

    导航 一.什么是链路追踪 二.Spring Cloud Sleuth 2.1 相关概念 三.Sleuth 入门案例 四.Zipkin 的集成 4.1 Zipkin 介绍 4.2 Zipkin 服务端安 ...

  2. 芋道 Spring Cloud Alibaba 介绍

    点击上方"芋道源码",选择"设为星标" 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RP ...

  3. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  4. Spring Cloud Alibaba一站式解决方案

    一.Spring Cloud Alibaba一站式解决方案 在springCloud的基础上延伸出来的微服务技术栈 为什么学习spring cloud alibaba? spring cloud多项组 ...

  5. 专栏结语:基于spring cloud的工具栈

    专栏结语 至此微服务Spring cloud全家桶的学习就告一段落了 代码地址 微服务搭建.治理工具如下 注册与发现:Eurake.consul.zookeeper API网关:Zuul.Spring ...

  6. SpringCloud 2020版本教程4:使用spring cloud sleuth+zipkin实现链路追踪

    点击关注公众号,Java干货及时送达 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可. 微服 ...

  7. Spring Cloud第九篇:链路追踪Sleuth

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

  8. Spring Cloud Alibaba 高级特性 应用性能监控:通过 SkyWalking 实施链路追踪

    上一讲我们掌握了基于 Sleuth+Zipkin 对微服务架构实施基于日志的链路追踪,通过 Sleuth 在微服务应用中附加链路数据,再通过 Zipkin 实现链路数据收集与可视化,从而保证开发与运维 ...

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

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

最新文章

  1. R语言colSums函数、rowSums函数、colMeans函数、rowMeans函数、colMedians函数、rowMedians计算dataframe行或者列的加和、均值、中位数实战
  2. 在.m中的@interface (原创)
  3. Mac中MacPorts安装和使用 MacPorts简介
  4. Hive之安装 部署
  5. 【报告分享】科技产业2021年投资策略:科技进步与中美再平衡下的新机遇.pdf(附下载链接)...
  6. UVA 10330 Power Transmission
  7. Deep manta算法解析
  8. Java克隆--深克隆与浅克隆的区别
  9. 一起谈.NET技术,疯狂的想法——基于.NET的软件超市平台构想与5年实现之路
  10. 服务器地图不显示图片,传奇小地图不显示怎么办 传奇服务端小地图制作教程...
  11. Android Sophix热修复集成
  12. Mac常用快捷键组合
  13. iOS safeAreaInsets安全区域相关知识
  14. WTL 绘制 圆角对话框 自绘对话框
  15. 固态继电器和可控硅的区别
  16. mySQL下载后的初次使用
  17. Linux中使用命令分类型统计系统光盘中rpm包数量
  18. win10系统应用程序无法正常启动提示0xc0000142错误的解决方法
  19. 论机房动力环境监控系统的重要性!
  20. 基于FPGA的SRIOIP例程及仿真实现

热门文章

  1. PS 合并RGB通道 编辑单通道
  2. linux找不到mysql命令行_解决linux系统中找不到命令的问题
  3. FFmpeg+SDL视频播放器
  4. vue 解决路由重复点击报错
  5. FT2232作为JTAG烧录器的使用步骤详解
  6. brew安装报错:fatal: not in a git directory Error: Command failed with exit 128: git
  7. 【初学者必看】vlc实现的rtsp服务器及转储H264文件
  8. finally关键字
  9. exp00091 oracle,EXP-00091错误的说明和解决方法
  10. STM32、GD32、ESP32 的区别