Spring Cloud Alibaba(13)—Sleuth概述

Sleuth概述

前言

在微服务架构中,众多的微服务之间互相调用,如何清晰地记录服务的调用链路是一个需要解决的问题。同时,由于各种原因,跨进程的服务调用失败时,运维人员希望能够通过

查看日志和查看服务之间的调用关系来定位问题,而Spring cloud sleuth组件正是为了解决微服务跟踪的组件。

一、背景

1、微服务的现状?

随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用

链路。一个请求完整调用链可能如下图所示(盗图):

随着业务规模不断增大、服务不断增多以及频繁变更的情况下,面对复杂的调用链路就带来一系列问题:

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

而链路追踪的出现正是为了解决这种问题,它可以在复杂的服务调用中定位问题,除此之外,如果某个接口突然耗时增加,也不必再逐个服务查询耗时情况,我们可以直观地分析

出服务的性能瓶颈,方便在流量激增的情况下精准合理地扩容。

2、什么是链路追踪

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

达哪台机器上、每个服务节点的请求状态等等。

3、链路追踪相关产品

常见的链路追踪技术有下面这些:

cat:由大众点评开源,基于Java开发的实时应用监控平台,包括实时应用监控,业务监控 。 集成方案是通过代码埋点的方式来实现监控,比如: 拦截器,过滤器等。 对代码

的侵入性很大,集成成本较高。风险较大。

zipkin:由Twitter公司开源,开放源代码分布式的跟踪系统,用于收集服务的定时数据,以解决微服务架构中的延迟问题,包括:数据的收集、存储、查找和展现。该产品结合

spring-cloud-sleuth使用较为简单, 集成很方便, 但是功能较简单。

pinpoint:Pinpoint是韩国人开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能强大,接入端无代码侵入。

skywalking:本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件, UI功能较强,接入端无代码侵入。目前已加入Apache孵化器。

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

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

二、Sleuth概述

1、什么是Sleuth

Spring Cloud Sleuth 为 Spring Cloud 实现了分布式跟踪解决方案。兼容 Zipkin,HTrace 和其他基于日志的追踪系统,例如 ELK(Elasticsearch 、Logstash、 Kibana)。

Spring Cloud Sleuth 提供了以下功能:

链路追踪 :通过 Sleuth 可以很清楚的看出一个请求都经过了那些服务,可以很方便的理清服务间的调用关系等。

性能分析 :通过 Sleuth 可以很方便的看出每个采样请求的耗时,分析哪些服务调用耗时,当服务调用的耗时随着请求量的增大而增大时, 可以对服务的扩容提供一定的提醒。

数据分析 ,优化链路:对于频繁调用一个服务,或并行调用等,可以针对业务做一些优化措施。

可视化错误 :对于程序未捕获的异常,可以配合 Zipkin 查看。

2、Sleuth基本概念

Sleuth基本概念涉及到三个专业术语: spanTraceAnnotations

span

基本工作单位, 每次发送一个远程调用服务就会产生一个 Span 。Span 是一个 64 位的唯一 ID。通过计算 Span 的开始和结束时间,就可以统计每个服务调用所花费的时间。。

Trace

一系列 Span 组成的树状结构,一个 Trace 认为是一次完整的链路,内部包含 n 多个 Span。Trace 和 Span 存在一对多的关系,Span 与 Span 之间存在父子关系。

Annotations

用来及时记录一个事件的存在,一些核心 annotations 用来定义一个请求的开始和结束。

cs - Client Sent:客户端发起一个请求,这个 annotation 描述了这个 span 的开始;
sr - Server Received:服务端获得请求并准备开始处理它,如果 sr 减去 cs 时间戳便可得到网络延迟;
ss - Server Sent:请求处理完成(当请求返回客户端),如果 ss 减去 sr 时间戳便可得到服务端处理请求需要的时间;
cr - Client Received:表示 span 结束,客户端成功接收到服务端的回复,如果 cr 减去 cs 时间戳便可得到客户端从服务端获取回复的所有所需时间。

核心 为什么能够进行整条链路的追踪? 其实就是一个 Trace ID 将 一连串的 Span 信息连起来了。根据 Span 记录的信息再进行整合就可以获取整条链路的信息。

3、举例理解Sleuth基本概念

上面这样写可能有点抽象,这里通过实际例子来解释(盗图)

1)这个图中 从1->6 是一个完整的请求,所以这个完整的请求中有一个相同的TraceId。

2)server1->server2 可以理解是一个接口的请求,所以他们有着相同的SpanId。同样道理 server2->server3,server2->server4 也有着相同的SpanId。同时parentid,

就是上一级的SpanId。

3)server1中的 cs cr - 分别代表请求server2的开始时间,和server1接收响应时间。(cr – cs)时间戳便可以得到整个请求所消耗的时间

4)server2中的 sr ss - 分别代表server2获取请求并准备开始处理它的开始时间,ss (服务端发送响应)– 代表server2服务结束执行时间。

二、实现原理

这里通过图片来循序渐进的理解Sleuth基本概念

如果想知道一个接口在哪个环节出现了问题,就必须清楚该接口调用了哪些服务,以及调用的顺序,如果把这些服务串起来,看起来就像链条一样,我们称其为调用链。

想要实现调用链,就要为每次调用做个标识,然后将服务按标识大小排列,可以更清晰地看出调用顺序,我们暂且将该标识命名为 spanid。

实际场景中,我们需要知道某次请求调用的情况,所以只有 spanid 还不够,得为每次请求做个唯一标识,这样才能根据标识查出本次请求调用的所有服务,而这个标识我们命名

为 traceid。

现在根据 spanid 可以轻易地知道被调用服务的先后顺序,但无法体现调用的层级关系,正如下图所示,多个服务可能是逐级调用的链条,也可能是同时被同一个服务调用。

所以应该每次都记录下是谁调用的,我们用 parentid 作为这个标识的名字。

到现在,已经知道调用顺序和层级关系了,但是接口出现问题后,还是不能找到出问题的环节,如果某个服务有问题,那个被调用执行的服务一定耗时很长,要想计算出耗时,

上述的三个标识还不够,还需要加上时间戳,时间戳可以更精细一点,精确到微秒级。

只记录发起调用时的时间戳还算不出耗时,要记录下服务返回时的时间戳,有始有终才能算出时间差,既然返回的也记了,就把上述的三个标识都记一下吧,不然区分不出是

谁的时间戳。

虽然能计算出从服务调用到服务返回的总耗时,但是这个时间包含了服务的执行时间和网络延迟,有时候我们需要区分出这两类时间以方便做针对性优化。那如何计算网络延迟

呢?我们可以把调用和返回的过程分为以下四个事件。

Client Sent 简称 cs,客户端发起调用请求到服务端。

Server Received 简称 sr,指服务端接收到了客户端的调用请求。

Server Sent 简称 ss,指服务端完成了处理,准备将信息返给客户端。

Client Received 简称 cr,指客户端接收到了服务端的返回信息。

假如在这四个事件发生时记录下时间戳,就可以轻松计算出耗时,比如 `sr 减去 cs 就是调用时的网络延迟,ss 减去 sr 就是服务执行时间,cr 减去 ss 就是服务响应的延迟,

cr 减 cs 就是整个服务调用执行的时间`。

其实 span 内除了记录这几个参数之外,还可以记录一些其他信息,比如发起调用服务名称、被调服务名称、返回结果、IP、调用服务的名称等,最后,我们再把相同 parentid

的 span 信息合成一个大的 span 块,就完成了一个完整的调用链。

最后:

最近我整理了整套**《JAVA核心知识点总结》**,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

进[Java架构资源交流群] ,找管理员获取哦-!

理了整套**《JAVA核心知识点总结》**,说实话 ,作为一名Java程序员,不论你需不需要面试都应该好好看下这份资料。拿到手总是不亏的~我的不少粉丝也因此拿到腾讯字节快手等公司的Offer

进[Java架构资源交流群] ,找管理员获取哦-!

Spring Cloud Alibaba(13)---Sleuth概述相关推荐

  1. Spring Cloud Alibaba - 13 OpenFeign应用篇

    文章目录 What's Feign ( Ribbon+RestTemplate) Vs Feign Feign整合 artisan-feign-api 子模块构建 Step1 搞依赖 Step2 修改 ...

  2. Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.1 Spring Cloud Alibaba Nacos 概述

    11.1 Spring Cloud Alibaba Nacos 概述 11.1.1 Spring Cloud Alibaba 简介 在一开始,我们先简单介绍下Spring Cloud Alibaba的 ...

  3. Spring Cloud Spring Cloud Alibaba 知识点总结

    欢迎访问:http://lss-coding.top/ 我自己的博客平台 1. 微服务架构简介 1.1 微服务架构概述 ​ 2014 年 3 月 Martin Fowler 提出微服务架构 ​ 微服务 ...

  4. golang微服务框架对比_微服务里程碑,Golang与Spring Cloud Alibaba完美结合

    目前微服务架构仍是软件架构中最新的热门话题,虽然Golang是一门新的语言,但Golang的性能比python和java高出不少.既能承受程序使用运行的服务构建的繁重负载,又容易与GitHub集成,管 ...

  5. 8.Spring Cloud Alibaba教程:整合Seata分布式事务

    概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务. 更多的介绍可以参考官方文档:Seata快速入门 本篇主要是介绍Spring Cloud Alibaba ...

  6. 7.Spring Cloud Alibaba教程:整合Dubbo实现RPC调用

    概述 Apache Dubbo 是一款高性能的.基于Java的开源RPC框架,它提供了以下特性: 基于接口的远程方法调用 智能负载均衡 服务自动注册和发现 高可扩展性 运行期流量调度 可视化的服务治理 ...

  7. Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合

    https://www.cnblogs.com/babycomeon/p/11546737.html Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合 ...

  8. spring cloud alibaba 全家桶详细整合

    文章目录 本项目代码仓库地址 一.此次版本信息说明: 二.组件说明 三.新建聚合工程 3.1父工程pom文件 四.搭建整合nacos 五. 整合nacos 注册中心,新建cloud-system模块 ...

  9. Spring Cloud Alibaba 介绍及使用

    Spring Cloud 介绍及使用 十五.Cloud Alibaba之Nacos 为什么会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 htt ...

最新文章

  1. 移动 Web 开发技巧
  2. 虚成员(virtual)
  3. DS5020配置集群存储
  4. 异步/scrapy想关
  5. 【janino】janino 加载自定义函数报错CompileException Expression bytesIn is not an rvalue
  6. 未来的商业,一定是基于在线化的
  7. “才子进销存”新一代真正基于互联网(Internet)的进销存分销管理软件
  8. 计算机二合一二级基础知识软件,全国计算机等级考试笔试+上机题库二合一二级Visual FoxPro...
  9. 3D脚本 maxscript入门教程(7)
  10. MySQL 中while loop repeat 的基本用法
  11. 记一次现网k8s中pod连接数据库异常的问题分析及解决实践(tcp_tw_recycle与tcp_tw_reuse内核参数修改)
  12. 学习单片机系列(一)单片机选型
  13. html、input隐藏内容占空间与隐藏内容不占空间
  14. hdu4699(对顶栈模拟+简单dp)
  15. html图片慢慢消失的事件,[Web前端]用javascript实现默认图片替代未显示的图片
  16. 幽默感也有套路:可用数学模型量化
  17. 坐标系,坐标系转换,梯度计算
  18. [Cu (L) (Phen )]·1/4H2O配合物
  19. 环保设施运行在线监控 数采仪环保工况监测终端
  20. 安装postgresql 数据库

热门文章

  1. python之禅中文原文_python之禅 pdf
  2. 知道 Redis-Cluster 么?说说其中可能不可用的情况
  3. Git入门与使用 (三) 使用GitHub进行代码托管的相关操作
  4. NVIDIA Jetson Xavier NX刷机教程
  5. _TrackMouseEvent 与 WIN32 ToolTip
  6. 【cocos creator】滑动列表复用,减少drawcall(TS)
  7. Windows10 关键错误,开始菜单cortana无法工作,重启无效
  8. macbook上网没问题但是无法连接到app store的解决办法
  9. vue 构建根组件_构建迷你图Vue组件
  10. linux基本功系列之hostname实战