为啥要使用链路追踪
微服务架构是一个分布式架构,它按照业务单元划分服务单元,一个分布式系统往往有很多服务单元。由于服务单元数量众多,业务复杂,如果出现错误和异常,很难定位。主要体现在一个请求可能调用了很多服务,而内部调用的复杂性,决定了问题难以定位。所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序是什么样子的,从而达到每个请求的步骤清晰可见,出了问题,能够很快定位。
Span:基本的工作单元。发送一个远程任务就会产生一个Span,Span是一个64位唯一标识,Trace是另一个64的唯一标识。Spring可以启动和停止,并追钟它们的时间线信息。如果你创建一个Span,你必须在将来某个时间点停止它。
Trace:一组Span形成的一个树状结构。
Annatiion/Event:用来及时记录一个事件的存在。
- cs:客户端请求。
- sr:服务端收到请求,并开始处理它。
- ss:服务端发送。
- cr:客户端接收。Span结束的标志。客户端已经成功从服务器端接收到了响应。
Spring Boot 整合 Sleuth
-
引入场景启动器
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
-
每一个微服务,都开启 debug日志,以便查看 sleuth 链路
logging: level: org.springframework.cloud.openfeign: debug org.springframework.cloud.sleuth: debug
Spring Boot 整合 zipkin 用于调用链的可视化
-
docker 安装 zipkin 服务器
docker run -d -p 9411:9411 openzipkin/zipkin
-
引入 zipkin 场景启动器
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> <version>2.2.8.RELEASE</version> </dependency>
引入zipkin就可以不用引入 sleuth,因为zipkin场景启动器中已经包含了 sleuth。
-
配置 zipkin
spring: zipkin: base-url: http://192.168.94.137:9411 ## 关闭服务发现,否则spring cloud会把 zipkin的url当作服务名 discovery-client-enabled: false sender: type: web sleuth: sampler: # 设置抽样采集率 probability: 1
-
查看链路追踪页面 http://192.168.94.137:9411
-
由于 zipkin 数据,默认是存储在内存中。但是我们也可以将链路追踪数据持久化到数据库中,比如存储在 ElasticSearch中
docker run --name zipkin -d -p 9411:9411 -e STORAGE_TYPE=elasticsearch -e ES_HOSTS=10.25.137.48:9200 openzipkin/zipkin