sleuth与zipkin服务链路追踪
一.笔记
百度云笔记 提取码1111 https://pan.baidu.com/s/1XNBzjwiy2W54-etm5-L5Dw
1、为什么用
微服务架构是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务
单元。由于服务单元数量众多,业务的复杂性,如果出现了错误和异常,很难去定位。主要
体现在,一个请求可能需要调用很多个服务,而内部服务的调用复杂性,决定了问题难以
定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,
参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
链路追踪组件有 Google 的 Dapper,Twitter 的 Zipkin,以及阿里的 Eagleeye (鹰眼)等,它
们都是非常优秀的链路追踪开源组件。
2、基本术语
Span(跨度):基本工作单元,发送一个远程调度任务 就会产生一个 Span,Span 是一
个 64 位 ID 唯一标识的,Trace 是用另一个 64 位 ID 唯一标识的,Span 还有其他数据信
息,比如摘要、时间戳事件、Span 的 ID、以及进度 ID。
Trace(跟踪):一系列 Span 组成的一个树状结构。请求一个微服务系统的 API 接口,
这个 API 接口,需要调用多个微服务,调用每个微服务都会产生一个新的 Span,所有
由这个请求产生的 Span 组成了这个 Trace。
Annotation(标注):用来及时记录一个事件的,一些核心注解用来定义一个请求的开
始和结束 。这些注解包括以下:
cs - Client Sent -客户端发送一个请求,这个注解描述了这个 Span 的开始
sr - Server Received -服务端获得请求并准备开始处理它,如果将其 sr 减去 cs 时间戳
便可得到网络传输的时间。
ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户
端),如果 ss 的时间戳减去 sr 时间戳,就可以得到服务器请求的时间。
cr - Client Received (客户端接收响应)-此时 Span 的结束,如果 cr 的时间戳减去
cs 时间戳便可以得到整个请求所消耗的时间。
如果服务调用顺序如下
3、整合 Sleuth
3.1.服务提供者与消费者导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
3.2.打开 debug 日志
logging:
level:
org.springframework.cloud.openfeign: debug
org.springframework.cloud.sleuth: debug
3.3.发起一次远程调用,观察控制台
DEBUG [user-service,541450f08573fff5,541450f08573fff5,false]
user-service:服务名
541450f08573fff5:是 TranceId,一条链路中,只有一个 TranceId
541450f08573fff5:是 spanId,链路中的基本工作单元 id
false:表示是否将数据输出到其他服务,true 则会把信息输出到其他可视化的服务上观察
4、整合 zipkin 可视化观察
通过 Sleuth 产生的调用链监控信息,可以得知微服务之间的调用链路,但监控信息只输出
到控制台不方便查看。我们需要一个图形化的工具-zipkin。Zipkin 是 Twitter 开源的分布式跟
踪系统,主要用来收集系统的时序数据,从而追踪系统的调用问题。
zipkin 官网地址 https://zipkin.io/
4.1.docker 安装 zipkin 服务器
docker run -d -p 9411:9411 openzipkin/zipkin
4.2.导入zipkin依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
zipkin 依赖也同时包含了 sleuth,可以省略 sleuth 的引用
4.3.添加 zipkin 相关配置
#zipkin服务器地址
spring.zipkin.base-url=http://192.168.56.10:9411/
#关闭服务发现,否则Spring Cloud会把zipkin的url当做服务名称。
spring.zipkin.discovery-client-enabled=false
#设置使用http的方式传输数据。
spring.zipkin.sender.type=web
#设置抽样采集率为100%,默认为0.1,即10%。
spring.sleuth.sampler.probability=1
4.3.1发送远程请求,测试 zipkin。
5、Zipkin 数据持久化
Zipkin 默认是将监控数据存储在内存的,如果 Zipkin 挂掉或重启的话,那么监控数据就会丢
失。所以如果想要搭建生产可用的 Zipkin,就需要实现监控数据的持久化。而想要实现数据
持久化,自然就是得将数据存储至数据库。好在 Zipkin 支持将数据存储至:
内存(默认)
MySQL
Elasticsearch
Cassandra
Zipkin 数据持久化相关的官方文档地址如下:
https://github.com/openzipkin/zipkin#storage-component
Zipkin 支持的这几种存储方式中,内存显然是不适用于生产的,这一点开始也说了。而使用
MySQL 的话,当数据量大时,查询较为缓慢,也不建议使用。Twitter 官方使用的是 Cassandra
作为 Zipkin 的存储数据库,但国内大规模用 Cassandra 的公司较少,而且 Cassandra 相关文
档也不多。
综上,故采用 Elasticsearch 是个比较好的选择,关于使用 Elasticsearch 作为 Zipkin 的存储数
据库的官方文档如下:
elasticsearch-storage:
https://github.com/openzipkin/zipkin/tree/master/zipkin-server#elasticsearch-storage
zipkin-storage/elasticsearch
https://github.com/openzipkin/zipkin/tree/master/zipkin-storage/elasticsearch
通过 docker 的方式
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200
openzipkin/zipkin-dependencies
二.使用sleuth与zipkin服务链路追踪
1.整合 Sleuth
1.1.服务提供者与消费者导入依赖
common项目加入sleuth依赖、版本控制
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
1.2.打开 debug 日志
如,每个项目添加此配置
logging:
level:
org.springframework.cloud.openfeign: debug
org.springframework.cloud.sleuth: debug
或者
logging.level.org.springframework.cloud.openfeign=debug
logging.level.org.springframework.cloud.sleuth=debug
1.3.发起一次远程调用,观察控制台
在商城首页查看商品,在product项目,看到链路追踪的结果如下
DEBUG [user-service,541450f08573fff5,541450f08573fff5,false]
user-service:服务名
541450f08573fff5:是 TranceId,一条链路中,只有一个 TranceId
541450f08573fff5:是 spanId,链路中的基本工作单元 id
false:表示是否将数据输出到其他服务,true 则会把信息输出到其他可视化的服务上观察
2.整合 zipkin 可视化观察
2.1. docker 安装 zipkin 服务器
docker run -d -p 9411:9411 openzipkin/zipkin
2.2导入zipkin依赖
common项目添加zipkin依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
zipkin 依赖也同时包含了 sleuth,可以省略 sleuth 的引用
2.3. 添加 zipkin 相关配置
所有项目添加zipkin 相关配置
#zipkin配置
#zipkin服务器地址
spring.zipkin.base-url=http://192.168.56.10:9411/
#关闭服务发现,否则Spring Cloud会把zipkin的url当做服务名称。
spring.zipkin.discovery-client-enabled=false
#设置使用http的方式传输数据。
spring.zipkin.sender.type=web
#设置抽样采集率为100%,默认为0.1,即10%。
spring.sleuth.sampler.probability=1
2.4 发送远程请求,测试 zipkin
项目启动后,控制台 INFO [项目名 ,] ,四个逗号,说明 zipkin成功配置
服务调用链追踪信息统计
1).商城首页把业务流程走一遍
2).登录zipkin主页
http://192.168.56.10:9411/
3.Zipkin 数据持久化
此处我们把链路追踪结果放到Elasticsearch中。也可以放到mysql。
Zipkin 数据持久化相关的官方文档地址如下:
https://github.com/openzipkin/zipkin#storage-component
3.1 通过 docker 的方式
docker run --env STORAGE_TYPE=elasticsearch --env ES_HOSTS=192.168.56.10:9200 openzipkin/zipkin-dependencies