链路追踪
一.Seluth概述
Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可。
二.链路追踪Seluth入门
1.配置依赖
在所有需要追踪的项目中添加如下依赖:
<!--sleuth链路追踪-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
2.修改配置文件,添加日志输出配置
每个微服务都需要添加如上的配置。启动微服务,调用之后,我们可以在控制台观察到sleuth的日志输出。
其中 2707c11b7b2daffd是TraceId,后面跟着的是SpanId,依次调用有一个全局的TraceId,将调用链路串起来。仔细分析每个微服务的日志,不难看出请求的具体过程。
查看日志文件并不是一个很好的方法,当微服务越来越多日志文件也会越来越多,通过Zipkin可以将日志聚合,并进行可视化展示和全文检索。
logging:
level:
root: INFO
org.springframework.web.servlet.DispatcherServlet: DEBUG
org.springframework.cloud.sleuth: DEBUG
三.Zipkin的概述
Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,
它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。
我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,
从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。
除了面向开发的 API 接口之外,它也提供了方便的 UI 组件来帮助我们直观的搜索跟踪信息和分析请求链路明细,比
如:可以查询某段时间内各用户请求的处理时间等。 Zipkin 提供了可插拔数据存储方式:InMemory、MySql、Cassandra 以及 Elasticsearch。
Zipkin 分为两端,一个是 Zipkin 服务端,一个是 Zipkin 客户端,客户端也就是微服务的应用。
客户端会配置服务端的 URL 地址,一旦发生服务间的调用的时候,会被配置在微服务里面的 Sleuth 的监听器监听,
并生成相应的 Trace 和 Span 信息发送给服务端。
发送的方式主要有两种,一种是 HTTP 报文的方式,还有一种是消息总线的方式如 RabbitMQ。
不论哪种方式,我们都需要:
- 一个 Eureka 服务注册中心,这里我们就用之前的 eureka 项目来当 注册中心。
- 一个 Zipkin 服务端。
- 多个微服务,这些微服务中配置Zipkin 客户端。
四.Zipkin Server的部署和配置
1. Zipkin Server下载
从spring boot 2.0开始,官方就不再支持使用自建Zipkin Server的方式进行服务链路追踪,而是直接提供了编译好的 jar 包来给我们使用。
可以从官方网站下载,下载地址直接点击:
下载Zipkin的webUI
我们这里下载的是zipkin-server-2.12.9-exec.jar
2. 启动
找到下载后的目录:打开命令行并输入以下命令
java -jar zipkin-server-2.12.9-exec.jar
启动 Zipkin Server,如下图所示表示成功。
- 默认Zipkin Server的请求端口为 9411
- Zipkin Server的启动参数可以通过官方提供的yml配置文件查找
- 在浏览器输入 http://127.0.0.1:9411即可进入到Zipkin Server的管理后台
五.客户端Zipkin+Sleuth整合
通过查看日志分析微服务的调用链路并不是一个很直观的方案,结合zipkin可以很直观地显示微服务之间的调用关系。
(1)客户端添加依赖
客户端指的是需要被追踪的微服务
<!--引入zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
(2)修改客户端配置文件,在yml文件的spring配置节点下添加如下内容:
#配置zipkin相关信息
zipkin:
base-url: http://127.0.0.1:9411 #设置zipking服务端的请求地址
sender:
type<