一、Spring Cloud Sleuth组件的作用
为微服务架构增加分布式服务跟踪的能力,对于每个请求,进行全链路调用的跟踪,可以帮助我们快速发现错误根源以及监控分析每条请求链路上的性能瓶颈等。
二、项目中如何引入Spring Cloud Sleuth组件
1)增加spring-cloud-starter-sleuth依赖
<!-- sleuth--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> <version>2.0.3.RELEASE</version> </dependency>
2)增加相应的项目配置
# 知道服务名称 spring.application.name: service-order # 指定leuth的抽样比例,1代表全部,该参数用于控制跟踪信息是否发送到第三方服务上入zipkin sleuth.sampler.probability: 1
3)修改项目日志的打印格式,目的就是打印跟踪相关的信息,入traceid,spanid等等
console-pattern:控制台输出的日志格式
file-pattern: 文件输出的日志格式
console-pattern: '%d{yyyy-MM-dd HH:mm:ss.SSS} [${spring.application.name:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %boldYellow([%thread]) %highlight(%-5level) %boldGreen(%logger{50}.%M\(%F:%L\)) - %msg%n' file-pattern: '%d{yyyy-MM-dd HH:mm:ss.SSS} [${spring.application.name:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] [%thread] %-5level %logger{50} - %msg%n'
4)controller方法增加日志输出并启动项目,用于查看日志打印的效果,比如
log.info("test sleuth log");
三、Sleuth相关概念介绍
1)Trace ID、SpanId等值介绍
运行项目并请求,你会看到这样的日志,如下:
2019-09-10 00:37:15.585 INFO [service-order,313fe940c4574c66,313fe940c4574c66,true] 5687 --- [io-10850-exec-1] c.zbq.order.controller.OrderController : test sleuth log
其中红色标出的为跟踪日志:[service-order,313fe940c4574c66,313fe940c4574c66,true]
这些元素正是实现分布式服务跟踪的重要组成部分,每个值的含义如下所述。
- 第一个值:service-order,它记录了应用的名称,也就是application.yml或bootstrap.yml中spring.application.name参数配置的属性。
- 第二个值:f410ab57afd5c145,Spring Cloud Sleuth生成的一个ID,称为Trace ID,它用来标识一条请求链路。一条请求链路中包含一个Trace ID,多个Span ID。
- 第三个值:a9f2118fa2019684,Spring Cloud Sleuth生成的另外一个ID,称为Span ID,它表示一个基本的工作单元,比如发送一个HTTP请求。
- 第四个值:false,表示是否要将该信息输出到Zipkin等服务中来收集和展示。
上面四个值中的Trace ID和Span ID是Spring CloudSleuth实现分布式服务跟踪的核心。在一次服务请求链路的调用过程中,会保持并传递同一个Trace ID,从而将整个分布于不同微服务进程中的请求跟踪信息串联起来。若多个服务同属于一个前端服务请求来源,那么它们的Trace ID是相同的,处于同一条请求链路中。
·X-B3-TraceId:一条请求链路(Trace)的唯一标识,必需的值。·X-B3-SpanId:一个工作单元(Span)的唯一标识,必需的值。·X-B3-ParentSpanId:标识当前工作单元所属的上一个工作单元,Root Span(请求链路的第一个工作单元)的该值为空。·X-B3-Sampled:是否被抽样输出的标志,1表示需要被输出,0表示不需要被输出。·X-Span-Name:工作单元的名称。
2)sleuth日志信息的抽样收集
Sleuth中的抽样收集策略是通过Sampler接口实现的
默认情况下,Sleuth会使用ProbabilityBasedSampler实现的抽样策略,以请求百分比的方式配置和收集跟踪信息。我们可以通过在application.properties中配置下面的参数对其百分比值进行设置,它的默认值为0.1,代表收集10%的请求跟踪信息。比如我们配置中指定的:
sleuth.sampler.probability: 1
在开发调试期间,通常会收集全部跟踪信息并输出到远程仓库,我们可以将其值设置为1。