sleuth和zipkin微服务里的链路跟踪
分布式链路跟踪介绍
对于一个微服务系统,大多数来自外部的请求都会经过数个服务的互相调用,得到返回的结果,一旦结果回复较慢或者返回了不可用,我们就需要确定是哪个微服务出了问题。于是就有了分布式系统调用跟踪的诞生。
现今业界分布式服务跟踪的理论基础主要来自于 google 的一篇论文《dapper, a large-scale distributed systems tracing infrastructure》,使用最为广泛的开源实现是 twitter 的 zipkin,为了实现平台无关、厂商无关的分布式服务跟踪,cncf 发布了布式服务跟踪标准 open tracing。国内,淘宝的“鹰眼”、京东的“hydra”、大众点评的“cat”、新浪的“watchman”、唯品会的“microscope”、窝窝网的“tracing”都是这样的系统。
spring cloud sleuth 介绍
一般的,一个分布式服务跟踪系统,主要有三部分:数据收集、数据存储和数据展示。根据系统大小不同,每一部分的结构又有一定变化。譬如,对于大规模分布式系统,数据存储可分为实时数据和全量数据两部分,实时数据用于故障排查(troubleshooting),全量数据用于系统优化;数据收集除了支持平台无关和开发语言无关系统的数据收集,还包括异步数据收集(需要跟踪队列中的消息,保证调用的连贯性),以及确保更小的侵入性;数据展示又涉及到数据挖掘和分析。虽然每一部分都可能变得很复杂,但基本原理都类似。
功能
spring cloud sleuth为服务之间调用提供链路追踪。sleuth可以帮助我们:
- 耗时分析: 通过sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时;
- 可视化错误: 对于程序未捕捉的异常,可以通过集成zipkin服务界面上看到;
- 链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。
spring cloud sleuth的组成
- trace:从客户发起请求(request)抵达被追踪系统的边界开始,到被追踪系统向客户返回响应(response)为止的过程.包含一系列的span,它们组成了一个树型结构
- span: 每个 trace中会调用若干个服务,为了记录调用了哪些服务,以及每次调用的消耗时间等信息,在每次调用服务时,埋入一个调用记录,称为一个“span”。span是基本的工作单元。span包括一个64位的唯一id,一个64位trace码,描述信息,时间戳事件,key-value 注解(tags),span处理者的id(通常为ip)。
最开始的初始span称为根span,此span中span id和 trace id值相同。 -
annotation: 用于及时记录存在的事件。常用的annotation如下
- cs - client sent:客户端发送一个请求,表示span的开始
- sr - server received:服务端接收请求并开始处理它。(sr-cs)等于网络的延迟
- ss - server sent:服务端处理请求完成,开始返回结束给服务端。(ss-sr)表示服务端处理请求的时间
- cr - client received:客户端完成接受返回结果,此时span结束。(cr-sr)表示客户端接收服务端数据的时间
zipkin介绍
spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用zipkin的存储来存储信息,利用zipkin ui来展示数据。
zipkin 是一个开放源代码分布式的跟踪系统,由twitter公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
每个服务向zipkin报告计时数据,zipkin会根据调用关系通过zipkin ui生成依赖关系图,显示了多少跟踪请求通过每个服务,该系统让开发者可通过一个 web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。
zipkin提供了可插拔数据存储方式:in-memory、mysql、cassandra以及elasticsearch。接下来的测试为方便直接采用in-memory方式进行存储,生产推荐elasticsearch。
spring cloud sleuth结合zipkin
在使用 spring boot 2.x 版本后,官方就不推荐自行定制编译了,让我们直接使用编译好的 jar 包.也就是说原来通过@enablezipkinserver或@enablezipkinstreamserver的路子,启动springbootapplication自建zipkin server是不行了
安装和部署zipkin
官方提供了一键脚本
curl -ssl https://zipkin.io/quickstart.sh | bash -s java -jar zipkin.jar
如果用 docker 的话,直接
docker run -d -p 9411:9411 openzipkin/zipkin
访问 http://localhost:9411/zipkin/
添加zipkin的支持
<!--分布式链路追踪--> <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.boot</groupid> <artifactid>spring-boot-starter-webflux</artifactid> </dependency>
配置文件
spring: sleuth: web: client: enabled: true sampler: probability: 1.0 # 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1 zipkin: base-url: http://localhost:9411/ # 指定了 zipkin 服务器的地址
上一篇: axios导出 exer
下一篇: Ajax常见问题有哪些?