随着服务越来越多,对调用链的分析会越来越复杂。
存在的问题:
1.微服务之间的调用错综复杂,用户发送请求经历哪些服务,调用链不清楚,没有一个自动化工具来维护调用链。
2.无法快速定位调用链中哪个环节出了问题。
3.无法快速定位调用链中哪个环节比较耗时。
Spring Cloud Sleuth提供分布式系统中链路追踪解决方案。
同类产品有:
1.SkyWallking:
是本土开源的基于字节码注入的调用链分析,以及应用监控分析工具。特点是支持多种插件,UI功能较强,接入端悟代码侵入。目前已加入Apache孵化。
2.cat是大众点评开源,基于java开发的实时应用监控平台,包括实时应用监控,业务监控。集成方案是通过代码埋点的方式实现监控。
Sleuth术语:
1.span(跨度):
基本的工作单元。span用一个64位的id唯一标示。
除ID外,span还包含其他数据,例如描述,时间戳事件,键值对的注解(标签),spanID,span父ID等。
span被启动和停止时,记录了时间信息。初始化span被称为"root span",该span的id和trace的ID相等。
2.trace(跟踪):
一组共享"root span"的span组成的树状结构称为trace。
trace也是用一位64位的ID唯一标识,trace中的所有span都共享trace的ID。
3.annotation(标注):
annotation用来记录事件的存在,其中,核心annotation用来定义请求的开始和结束。
3.1 CS(Client Sent 客户端发送):客户端发起一个请求,该annotation描述span的开始
3.2 SR(Server Received服务器端接收):服务器端得到请求并准备处理它。如果用SR减去CS时间戳,就可以得到网络延迟。
3.3 SS(Server Sent服务器端发送):该annotation表明完成请求处理(当响应发回客户端时)。如果用SS减去SR时间戳,就能得到服务器端处理请求所需的时间。
3.4 CR(Client Received客户端接收):span结束的标识。客户端成功接收到服务器端的响应。如果用CR减去CS的时间戳就可以得到从客户端发送请求到服务端响应的所需的时间。
sr - cs = 网络延时 ss - sr = 服务器上的请求处理时间 cr - ss = 响应网络延时 cr - cs = 请求的总时间
Zipkin:可以与Sleuth结合使用,将Sleuth的数据展示出来。
Zipkin下载地址:Central Repository: io/zipkin/zipkin-server (maven.org)
下载后使用命令启动zipkin控制台
java -jar zipkin-server-2.14.1-exec.jar --server.port=9999
代码示例:
在cloud-goods中写一个action调用cloud-jifen,在cloud-jifen调用cloud-order。
形成一个调用链。
cloud-goods、cloud-jifen、cloud-order都做如下两项设置,
1.pom文件添加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
2.配置文件中增加sleuth和zipkin的配置:
spring:
zipkin:
base-url: http://localhost:9999
discovery-client-enabled: false #不在nacos注册
sleuth:
sampler:
rate: 100 #采样率
配置完成后,重新启动服务。
再发送请求,即可在zipkin的控制台看到请求的链路信息: