在微服务框架中,一个由客户端发起的请求在后端系统中会经过不同的服务节点调用来协同产生的最后的请求结果,每一个前端请求都会形成一条复杂的分布式调用链路,链路中的任何一个环节出现高延时或错误都会引起整个请求的失败。
Spring Cloud Sleuth为Spring Cloud实现了分布式跟踪解决方案,且兼容Zipkin,结合Zipkin做链路跟踪。Spring Cloud Sleuth服务链路跟踪功能可以帮助我们快速的发现错误根源以及监控分析每条请求链路上的性能。
ZipkinZipkin是一个分布式跟踪系统。 它有助于收集解决服务体系结构中的延迟问题所需的时序数据。 功能包括该数据的收集和查找。Zipkin最初是为了在Cassandra上存储数据而构建的,因为Cassandra是可扩展的,具有灵活的模式,并且在Twitter中大量使用。 除了支持Cassandra,还支持ElasticSearch和MySQL。
如果日志文件中有跟踪ID,则可以直接跳至该跟踪ID。 还可以基于属性进行查询,例如服务,操作名称,标签和持续时间,服务中花费的时间百分比以及操作是否失败。
Zipkin UI还提供了一个依赖关系图,该关系图显示了每个应用程序中跟踪了多少个请求。 这对于识别聚合行为(包括错误路径或对不赞成使用的服务的调用)很有帮助。
官方的术语Trace:类似于树结构的Span结合,表示一条调用链路,存在唯一标识。
Span:标识调用链路来源,通俗的理解span就是一次请求信息。
Annotation:用于及时记录存在的事件。常用的Annotation如下:
cs:客户端发送(client send) 客户端发起一个请求,表示span开始
sr:服务器接收(server received) 服务器接收到客户端的请求并开始处理,sr - cs 的时间为网络延迟
ss:服务器发送(server send) 服务器处理完请求准备返回数据给客户端。ss - sr 的时间表示服务器端处理请求花费的时间
cr:客户端接收(client received) 客户端接收到处理结果,表示span结束。 cr - cs 的时间表示客户端接收服务端数据的时间
调用链路一个请求过来,调用服务,一条链路通过Trace Id唯一标识,Span标识发起的请求,各Span通过parent id关联起来。
简单的来看
服务的调用关系
搭建springcloud从F版已不需要自己构建Zipkin Server了,只需要调用jar包即可。
首先安装Zipkin Server,Zipkin Server是将追踪的链路数据存储在内存中,一旦程序重启,之前的链路数据全部丢失,那么怎么将链路数据存储起来呢?Zipkin支持Mysql、Elasticsearch、Cassandra存储。在这里使用Zipkin Server存储在内存中,后续讲解其他存储。
Zipkin Server下载地址:https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下载zipkin-server-2.12.9-exec.jar。
执行命令:java -jar zipkin-server-2.12.9-exec.jar
浏览器输入http://localhost:9411/zipkin/,出现以下界面安装成功。
项目还是基于之前学习springcloud其他组件搭建的demo。
在springcloud-feign-Consumer,springcloud-feign-provider添加依赖
<!--包含了sleuth zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
修改springcloud-feign-consumer,springcloud-feign-provider的配置文件,添加如下配置
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
#采样率值介于 0 到 1 之间,1 则表示全部采集
probability: 1
添加测试请求Consumer端:
@GetMapping("/consumer/test/zipkin")
public String paymentZipkin()
{
// 远程调用方法的主机地址
String host = "http://springcloud-provider";
// 远程调用方法的具体 URL 地址
String url = "/provider/test/zipkin";
return restTemplate.getForObject(host url,String.class);
}
Provider端:
@GetMapping("/provider/test/zipkin")
public String testZipkin()
{
return "Hello Spring Cloud Sleuth";
}
启动springcloud eureka,springcloud consumer,springcloud provider。
启动成功后,访问我们之前写的测试的请求。
http://localhost:4000/consumer/test/zipkin。
访问zipkin,就可以查看我们的请求的链路信息,请求响应时间,依赖信息等
点击servies可以查看详细的信息
先介绍到这里,也算一个入门了,Spring Cloud Sleuth还有其他的很多知识,后续再分享,如果觉得对你有用,可以赞赏,关注,转发。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved