前言
微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。所以在微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题能够快速定位的目的,这正是调用链监控要做的事情。Spring Cloud提供Sleuth来实现调用链监控。
简介
Spring Cloud Sleuth为Spring Cloud提供了分布式跟踪的解决方案,它大量借用了Google Dapper、Twitter Zipkin和Apache HTrace的设计。
TIPS
-
Spring Cloud Sleuth的GitHub:github.com/spring-clou…
-
Dapper论文:research.google.com/pubs/pub363…
术语
Spring Cloud Sleuth借用了Dapper的术语。
Span:基本工作单元,例如,发送RPC是一个新的span,就像向RPC发送响应一样,Span由span的唯一64位ID标识,另一个64位ID标识其所属的Trace。Span还有其他数据,例如描述、带时间戳的事件、键值annotations(标签),导致它们的span的ID以及进程ID(通常是IP地址)。
span可以启动和停止,它们可以追踪自己的时间信息,创建span后,必须在将来的某个时刻停止它。
启动Trace的初始span称为
root span,该span的ID值等于trace ID。
Trace:一组span形成的树状结构,例如,如果运行分布式大数据存储,则可能由PUT请求形成trace。
Annotation:用于及时记录事件的存在,使用Brave工具,不再需要为Zipkin设置特殊的事件来了解客户端和服务器是谁、请求在哪里开始以及在哪里结束,然而,出于学习目的,标记这些事件以突出发生了什么类型的操作。
-
cs:Client Sent,客户端发起了一个请求,这个annotation表示span的开始。
-
sr:Server Received,服务器端获得了请求并开始处理它,从此时间戳中减去
cs时间戳会显示网络延迟。 -
ss:Server Sent,在请求处理完成时注释(当响应被发送回客户端时),从此时间戳中减去
sr时间戳会显示服务器端处理请求所需的时间。 -
cr:Client Received,表示span的结束,客户端已成功从服务器端收到响应,从此时间戳中减去
cs时间戳会显示客户端从服务器接收响应所需的全部时间
项目结构
- microservice-user:会员服务
快速开始
-
pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> -
增加配置
logging: level: root: INFO org.springframework.cloud.sleuth: DEBUG以上配置主要是打印Sleuth相关的日志
-
测试
启动
microservice-user访问
http://localhost:8000/users/1查看日志2019-10-22 11:38:44.256 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicBinder : binding parameter [1] as [BIGINT] - [1] 2019-10-22 11:38:44.256 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([age2_0_0_] : [INTEGER]) - [20] 2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([balance3_0_0_] : [NUMERIC]) - [100.00] 2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([name4_0_0_] : [VARCHAR]) - [张三] 2019-10-22 11:38:44.257 TRACE [microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false] 2396 --- [nio-8000-exec-2] o.h.type.descriptor.sql.BasicExtractor : extracted value ([username5_0_0_] : [VARCHAR]) - [account1]可以看到有很多
[microservice-provider-user,628a86eebdf5ae00,628a86eebdf5ae00,false]信息,分别代表服务名称、TraceId、SpanId、是否采样。
总结
本文主要是让大家了解下Sleuth的基本概念以及如何整合,后面会介绍它的具体使用。