Spring Cloud Sleuth和Zipkin
2020-11-09 本文已影响0人
quanCN
Spring Cloud Sleuth
-
添加依赖
<!--sleuth--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
该依赖是一个
starter
依赖,服务现在就会完成如下功能- 检查每个传入的HTTP服务,并确定调用中是否存在Spring Cloud Sleuth跟踪信息。如果Spring Cloud Sleuth跟踪数据确实存在,则将捕获传递到微服务的跟踪信息,并将跟踪信息提供给服务以进行日志记录和处理
- 将Spring Cloud Sleuth跟踪信息添加到Spring MDC,以便微服务创建的每个日志语句都添加到服务中
- 将Spring Cloud跟踪信息注入服务发出的每个出站HTTP调用以及Spring消息传递通道的消息中
注:MDC
映射诊断上下文(Mapped Diagnostic Context) -
剖析Spring Cloud Sleuth跟踪
加入依赖后,该服务的任何日志语句现在都包含Spring Cloud Sleuth跟踪信息。如图
Spring Cloud Sleuth向每一个日志添加以下4条信息
- 服务的应用程序名称
这是创建日志条目时所在的应用程序的名称,默认情况下,Spring Cloud Sleuth将应用程序的名称(spring.application.name
)作为在跟踪中写入的名称 - 跟踪ID(trace ID)
跟踪ID是关联ID的等价术语,它是表示整个事务的唯一编号 - 跨度ID(span ID)
跨度ID是表示整个事务中某一部分的唯一ID。参与事务的每一个服务都将具有自己的跨度ID。当与Zipkin集成来可视化事务时,跨度ID尤其重要 - 是否将跟踪数据发送到
Zipkin
Spring Cloud Sleuth跟踪块末尾的true/false
指示器用于指示是否将跟踪信息发送到Zipkin
- 服务的应用程序名称
日志聚合与Spring Cloud Sleuth
-
日志聚合方案列表
-
统一日志记录,以下几点至关重要
- 确保在服务开发的早期定义和实现日志策略
- 日志记录是微服务基础设施的一个关键部分
- 学习日志记录工具
使用OpenZipkin进行分布式跟踪
OpenZipkin
(也称Zipkin)是一个分布式跟踪平台,可以用于跟踪跨多个服务调用的事务。Zipkin
允许开发人员以图形方式查看事务占用的时间量,并分解在调用中涉及的每个微服务所用的时间。
Zipkin服务器
-
启动
官网推荐两种启动方式:
- Docker
docker pull openzipkin/zipkin docker run -d -p 9411:9411 openzipkin/zipkin
- jar启动
curl -sSL https://zipkin.io/quickstart.sh | bash -s java -jar zipkin.jar
- Docker
-
test
服务器运行后,可以使用Zipkin UI查看跟踪http://localhost:9411/zipkin/
注
:spring-cloud-sleuth-stream
官网已经不推荐使用
Zipkin + Spring Cloud Sleuth
- 配置
<!--sleuth--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <!--zipkin--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> </dependency>
- 配置服务指向
Zipkin
#zipkin serve url spring.zipkin.base-url=http://localhost:9411 #100%跟踪 spring.sleuth.sampler.probability=1.0
- 使用Zipkin跟踪事务即可
- 自定义跨度
import brave.Span; import brave.Tracer; @Autowired private Tracer tracer; public void fun1(){ //自定义跨度 Span newSpan = tracer.nextSpan().name("newSpan").start(); try (Tracer.SpanInScope ws = tracer.withSpanInScope(newSpan.start())){ // code }finally { newSpan.finish(); log.debug("Adding custom spans"); } }
注
:Spring Cloud Hoxton.SR8,Spring Boot 2.3.0.RELEASE