Zipkin是最早流行起来的主流分布式跟踪平台,起源于Google Dapper并由Twitter进一步开发。而后Uber用Golang实现了Jaeger。Jaeger除了兼容Zipkin原有的大部分功能以外,还提供了更为丰富的功能。对比来说,两者都是比较成熟稳定的分布式跟踪解决方案。
考虑Jaeger更好的性能、更轻量的资源占用,所以决定在项目中使用Jaeger。
Spring Cloud 的Sleuth官方支持兼容Zipkin,在pom中引入spring-cloud-starter-sleuth
和spring-cloud-sleuth-zipkin
即可。使用起来非常方便。
实现方案一
因为Spring Cloud官方的Sleuth支持Zipkin,且Jaeger兼容Zipkin,其实可以直接按照官方文档配置引入Sleuth和Zipkin的依赖,并在配置中将spring.zipkin.baseUrl
指向Jaeger实现。
Spring Cloud Sleuth官方文档:https://spring.io/projects/spring-cloud-sleuth
在这种方案下,Spring Cloud通过HTTP协议将日志和跟踪数据传递给Jaeger。
实现方案二
Github社区opentracing-contrib
提供了SpringBoot接入Jaeger的第三方解决方案。该方案的好处是支持UDP协议传输日志跟踪数据。基于社区方案,对接也非常简单。
1、在pom.xml中引入依赖
<dependency>
<groupId>io.opentracing.contrib</groupId>
<artifactId>opentracing-spring-jaeger-cloud-starter</artifactId>
<version>3.3.1</version>
</dependency>
2、修改配置文件,配置Jaeger服务器地址
opentracing:
jaeger:
enabled: true # 启用对接Jaeger(可以不配置,默认true)
enable128-bit-traces: true # 使用短TraceID(可以不配置)
udp-sender:
host: 192.168.1.102 # 配置Jaeger服务器地址
项目启动后,访问接口即可在Jaeger中看到数据。值得一提的是,Spring的Redis、JDBC也接入了Jaeger,这给我们带来的非常好的跟踪体验。可以在下图中看到,Redis和数据库查询的语句和时间也被记录到了Jaeger中,这对我们调试、优化程序有非常大的帮助。
扩展阅读
开发时,可以通过Jaeger提供的all-in-one全家桶Docker镜像进行部署。Docker启动后,直接访问http://地址:16686
即可访问Jaeger面板。当然,生产环境下不能使用这种all-in-one的,具体可以查看官方文档的推荐实践。
Jaeger官方文档:https://www.jaegertracing.io/docs/1.33/getting-started/
docker run -d --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.33
另外,在开发时,尤其是配合客户端、测试工作时,我们常常需要查看接口完整的请求、响应数据,我们可以通过 Servlet 提供的 Filter 轻松实现这个功能。可参考下一篇文章 《SpringBoot 利用Filter将请求数据、响应数据写入日志》
转载请注明出处
《Spring Boot 2.x 整合Jaeger实现分布式跟踪(链路、日志、性能监测)》https://www.ywlib.com/archives/191.html (from 一闻自习室)
本文固定链接
https://www.ywlib.com/archives/191.html
标签
Spring Boot, Jaeger, Zipkin, 分布式跟踪, 日志