Sleuth 服务链路追踪

1、简介

随着业务的发展,单体架构变为微服务架构,并且系统规模也变得越来越大,各微服务间的调用关系也变得越来越复杂。 在微服务的应用中,一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生请求结果。在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求后的失败。怎么样将请求过程的数据记录下来呢?这就需要用到服务链路追踪。

Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了 Google Dapper、Twitter Zipkin和Apache HTrace的设计,它在整个分布式系统中能跟踪一个用户请求的过程(包括数据采集,数据传输,数据存储,数据分析,数据可视化),捕获这些跟踪数据,就能构建微服务的整个调用链的视图,是调试和监控微服务的关键工具。

Spring Cloud Sleuth有4个特点:
提供链路追踪,通过sleuth可以很清楚的看出一个请求经过了哪些服务, 可以方便的理清服务间的调用关系 ;
性能分析,通过sleuth可以很方便的看出每个采集请求的耗时,分析出哪些服务调用比较耗时,当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用;
数据分析优化链路,对于频繁地调用一个服务,或者并行地调用等, 可以针对业务做一些优化措施 ;
可视化,对于程序未捕获的异常,可以在zipkin界面上看到 。

相关概念:
span (跨度,或者微服务节点),是工作中最基本的一个工作单元;
trace 一组共享“root span”的span组成的树状结构称为trace。trace也用一个64位的ID 唯一标识,trace中的所有span都共享该traceId;
Annotation(标记)
cs(client send)客户端发送 - 客户端已经发出请求。此注释描绘了跨度的开始;
sr(server received)服务器接收 - 服务器端得到请求,并将开始处理它 ;
ss (server send)服务器发送 - 在完成请求处理后(响应发送回客户端时)注释;
cr(client received)客户端接收 - 表示跨度的结束。客户端已成功接收到服务器端的响应;
计算网络延时: 请求延时=sr-cs , 响应延时 cr-ss ;
计算服务器处理时间:ss-sr ;
计算客户端请求时间:cr-cs=请求延时+服务器处理时间+响应延时=(sr-cs)。

在一次Trace中,每个服务的每一次调用 ,就是一个基本工作单元 ,请求过程中的每一个树节点,称之为 span 。每一个span都有一个 id作为唯一标识 ,同样每一次Trace都会生成一个 traceId在span中作为追踪标识 ,另外再通过一个 parentId标明本次调用的发起者 (就是发起者的span-id)。当span有了上面三个标识后,就可以很清晰的将多个span 进行梳理串联,终归纳出一条完整的跟踪链路。此外,span还会有其他数据,比如:名称、节点上下文、时间戳以及K-V结构的tag信息等等。

一次追踪链路会包含很多个span,因此一个trace便是一个数组,其标准的json结构如下:
在这里插入图片描述
在这里插入图片描述

2、集成

引入依赖

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

修改配置

# 设置sleuth日志级别
logging.level.org.springframework.cloud.sleuth=debug

3、整合Sleuth+Zipkin

3.1 介绍

Zipkin是Twitter开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Dapper的论文设计而来。它的主要功能是收集系统的时序监控数据,从而追踪微服务架构 的系统延时等问题。Zipkin还提供了一个非常友好的界面,帮助我们分析追踪数据。 一个独立的分布式追踪系统,客户端存在于应用中(即各服务中),应具备追踪信息生成、 采集发送等功能,而服务端应该包含以下基本的三个功能:
信息收集:用来收集各服务端采集的信息,并对这些信息进行梳理存储、建立索引。
数据存储:存储追踪数据。
查询服务:提供查询请求链路信息的接口。

zipkin(服务端)包含四个组件,分别是collector、storage、search、web UI。
collector 就是信息收集器,作为一个守护进程,它会时刻等待客户端传递过来的 追踪数据,对这些数据进行验证、存储以及创建查询需要的索引。
storage 是存储组件。zipkin 默认直接将数据存在内存中,此外支持使用 Cassandra、ElasticSearch 和 Mysql。
search 是一个查询进程,它提供了简单的JSON API来供外部调用查询。
web UI 是zipkin的服务端展示平台,主要调用search提供的接口,用图表将链 路信息清晰地展示给开发人员。

3.2 构建zipkin server端

在使用 Spring Boot 2.x 版本后,官方就不推荐自行定制编译了,而是直接提供了编译好的 jar 包来给我们使用 ,下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
启动

 java ‐jar zipkin‐server‐2.10.4‐exec.jar 

WEB页面访问: http://localhost:9411/

3.3 构建zipkin 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>

修改配置

#zipkin server的地址
spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.web.client.enabled=true
#采样比例默认是0.1 为1表示全部上报
spring.sleuth.sampler.probability=1

3.4 sleuth+zipkin+rabbitm进行上报

启动命令

 RABBIT_ADDRESSES=192.168.3.14 java ‐jar zipkin‐server‐2.10.4‐exec.jar

linux环境启动,会在rabbitmq中生成一个zipkin队列。

client 端引入依赖

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-stream-binder-rabbit</artifactId>
        </dependency>

修改配置

#zipkin server的地址
#spring.zipkin.base-url=http://localhost:9411/
spring.sleuth.web.client.enabled=true
#采样比例默认是0.1 为1表示全部上报
spring.sleuth.sampler.probability=1

spring.rabbitmq.host=
spring.rabbitmq.port=
spring.rabbitmq.password=
spring.rabbitmq.username=
spring.rabbitmq.virtual-host=/

3.5 )sleuth+zipkin+mysql 持久化

创建一个名为zipkin的数据库

CREATE TABLE `zipkin_annotations` ( `trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses  128 bit traceIds instead of 64 bit', `trace_id` bigint(20) NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', `span_id` bigint(20) 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(11) NOT NULL COMMENT 'BinaryAnnotation.type() or ­1 if Annotation', `a_timestamp` bigint(20) DEFAULT NULL COMMENT 'Used to implement TTL; Annotation.timestamp  or zipkin_spans.timestamp', `endpoint_ipv4` int(11) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_ipv6` binary(16) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null,  or no IPv6 address', `endpoint_port` smallint(6) DEFAULT NULL COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_service_name` varchar(255) DEFAULT NULL COMMENT 'Null when  Binary/Annotation.endpoint is null', UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`span_id`,`a_key`,`a_timestamp`), KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`span_id`), KEY `trace_id_high_3` (`trace_id_high`,`trace_id`), KEY `endpoint_service_name` (`endpoint_service_name`), KEY `a_type` (`a_type`), KEY `a_key` (`a_key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

CREATE TABLE `zipkin_dependencies` ( `day` date NOT NULL, `parent` varchar(255) NOT NULL, `child` varchar(255) NOT NULL, `call_count` bigint(20) DEFAULT NULL, `error_count` varchar(255) DEFAULT NULL, UNIQUE KEY `day` (`day`,`parent`,`child`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;
CREATE TABLE `zipkin_spans` (
`trace_id_high` bigint(20) NOT NULL DEFAULT '0' COMMENT 'If non zero, this means the trace uses  128 bit traceIds instead of 64 bit', `trace_id` bigint(20) NOT NULL, `id` bigint(20) NOT NULL, `name` varchar(255) NOT NULL, `parent_id` bigint(20) DEFAULT NULL, `debug` bit(1) DEFAULT NULL, `start_ts` bigint(20) DEFAULT NULL COMMENT 'Span.timestamp(): epoch micros used for endTs  query and to implement TTL', `duration` bigint(20) DEFAULT NULL COMMENT 'Span.duration(): micros used for minDuration and  maxDuration query', UNIQUE KEY `trace_id_high` (`trace_id_high`,`trace_id`,`id`), UNIQUE KEY `trace_id_high_4` (`trace_id_high`,`trace_id`,`id`), KEY `trace_id_high_2` (`trace_id_high`,`trace_id`,`id`), KEY `trace_id_high_3` (`trace_id_high`,`trace_id`), KEY `trace_id_high_5` (`trace_id_high`,`trace_id`,`id`), KEY `trace_id_high_6` (`trace_id_high`,`trace_id`), KEY `name` (`name`), KEY `start_ts` (`start_ts`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED;

zipkin server启动

RABBIT_ADDRESSES=192.168.1.1 java -jar zipkin-server-2.10.4-exec.jar -STORAGE_TYPE=mysql --MYSQL_DB=zipkin --MYSQL_USER=root -MYSQL_PASS=root --MYSQL_HOST=localhost --MYSQL_TCP_PORT=3306

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值