本文为博主原创,转载请注明出处
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:技术太牛批,用的人少,自己选择,不过官方推荐
Sleuth是一个用于在基于Spring Cloud的应用中实现分布式追踪的库。Sleuth可以自动收集应用的调用链数据,并将这些数据发送给Zipkin。
在Spring Cloud中,我们可以采用Sleuth加Zipkin来实现全链路追踪,Sleuth负责采集链路信息,Zipkin负责处理展示这些信息。
2.spring cloud项目使用
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在这个配置中,spring.zipkin.baseUrl是Zipkin服务的地址,spring.sleuth.sampler.probability是采样率,用于控制Sleuth收集跟踪信息的频率。
Sleuth和Zipkin可以帮助我们实现全链路追踪。在使用这两个工具的过程中,我们不需要在代码中写链路追踪相关的功能接入,这是因为Sleuth会自动收集应用的调用链数据,并将这些数据发送给Zipkin。
3.zipkin 接入 Elasticsearch
在结合Elasticsearch使用时,你需要在Zipkin的配置文件中指定存储类型为Elasticsearch,并提供Elasticsearch的连接信息。以下是一个使用Elasticsearch作为存储的Zipkin配置文件的例子:
1.Zipkin 启动时只需要指定好 Elasticsearch 连接信息即可。如果是通过 jar 包运行,则执行如下命令:
java -jar zipkin-server-2.19.3-exec.jar --STORAGE_TYPE=elasticsearch --ES_HOSTS=192.168.60.133:92002. 如果通过 Docker 镜像运行,则执行如下命令:
docker run --name zipkin -d -p 9411:9411 -e STORAGE_TYPE=elasticsearch -e ES_HOSTS=192.168.60.133:9200 openzipkin/zipkin3. 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:94114.链路追踪过程
以下是Sleuth和Zipkin的工作过程:
- 当一个请求到达系统的入口时,
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.jarZipkin server是一个java1.8+服务,打包为一个可执行jar。
java -jar zipkin-server-2.23.2-exec.jar浏览器打开地址进入到Zipkin监控页面:
http://127.0.0.1:9411/










