zipkin 与 sleuth 实现链路追踪
本文为博主原创,转载请注明出处
1.Zipkin 与 Sleuth 简介
zipkin 的官网地址:
https://zipkin.io/
Zipkin
和 Sleuth
都是由 Twitter 开源的一套用于分布式系统的应用监控工具,它们的主要用途是帮助开发者理解系统的行为,以便更好地优化系统。
Zipkin是一个分布式追踪系统,它可以帮助开发者理解服务之间的调用关系,以及每个服务的性能。Zipkin
的基础架构包括四个核心组件:
-
Collector:收集器组件,主要用于处理从外部系统发送过来的跟踪信息,将这些信息转换为
Zipkin
内部处理的Span
格式,以支持后续的存储、分析、展示等功能。 -
Storage:存储组件,主要对处理收集器接收到的跟踪信息,默认会将这些信息存储在内存中,我们也可以修改此存储策略,通过使用其他存储组件将跟踪信息存储到数据库中。
-
RESTful API:API组件,主要用来提供外部访问接口。比如给客户端展示跟踪信息,或是外接系统访问以实现监控等。
-
UI:基于API组件实现的上层应用。通过UI组件用户可以方便而有直观地查询和分析跟踪信息。
Zipkin
的信息默认是存储在内存中,服务端一旦重启信息将会丢失,但是Zipkin
提供了可插拔式的存储。Zipkin
支持以下四种存储方式:
-
内存:服务重启将会失效,不推荐
-
MySQL:数据量越大性能较低
-
Elasticsearch:主流的解决方案,推荐使用
-
Cassandra:技术太牛批,用的人少,自己选择,不过官方推荐
在Spring Cloud中,我们可以采用Sleuth
加Zipkin
来实现全链路追踪,Sleuth
负责采集链路信息,Zipkin
负责处理展示这些信息。
2.spring cloud项目使用
在Java项目中使用Zipkin
和Sleuth
,需要在项目中添加Sleuth
和Zipkin
的依赖,然后在配置文件中启用Sleuth
和Zipkin
。以下是一个使用Maven
添加Sleuth
和Zipkin
依赖的例子:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
在配置文件中,需要启用 Sleuth 和 Zipkin ,并指定 Zipkin 的服务地址。以下是一个使用 application.properties配置文件启用 Sleuth 和 Zipkin 的例子:
spring.zipkin.baseUrl=http://localhost:9411/
spring.sleuth.sampler.probability=1.0
java -jar zipkin-server-2.19.3-exec.jar --STORAGE_TYPE=elasticsearch --ES_HOSTS=192.168.60.133:9200
2. 如果通过 Docker 镜像运行,则执行如下命令:
docker run --name zipkin -d -p 9411:9411 -e STORAGE_TYPE=elasticsearch -e ES_HOSTS=192.168.60.133:9200 openzipkin/zipkin
3. Docker Compose 进行启动
services:
zipkin:
image: openzipkin/zipkin
container_name: zipkin
environment:
- STORAGE_TYPE=elasticsearch
- ES_HOSTS=192.168.60.133:9200
#- RABBIT_ADDRESSES=192.168.60.133:5672
#- RABBIT_USER=hangge
#- RABBIT_PASSWORD=123
ports:
- 9411:9411
4.链路追踪过程
-
当一个请求到达系统的入口时,
Sleuth
会创建一个唯一ID(traceId
),这个traceId
会在服务之间传递,直到请求的返回,那么就可以使用这个traceId
将整个请求串联起来,形成一条完整的链路。 -
Sleuth
会记录每个服务调用的开始时间(cs
,Client Send)和结束时间(cr
,Client Received),以及服务端接受请求的时间(sr
,Server Received)和服务端处理完毕准备发送到客户端的时间(ss
,Server Send)。通过这些时间戳,我们可以统计服务调用的耗时。 -
Sleuth
会将这些数据作为Span
(基本的工作单元)发送给Zipkin
。 -
Zipkin
会接收到Sleuth
发送过来的Span
,然后将这些Span
按照traceId
进行排序,形成一个完整的调用链。 -
我们可以通过
Zipkin
的Web界面查看这个调用链,以及每个服务的耗时等信息。
5.启动zipkin
zipkin-server最新版本下载地址:
https://repo1.maven.org/maven2/io/zipkin/zipkin-server/2.23.2/zipkin-server-2.23.2-exec.jar
Zipkin server是一个java1.8+服务,打包为一个可执行jar。
java -jar zipkin-server-2.23.2-exec.jar
浏览器打开地址进入到Zipkin监控页面:
http://127.0.0.1:9411/