一、简介
在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点来协同产生最后的请求结果,每一个前端请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。
所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题,很快定位。
SpringCloud Sleuth提供了一套完整的服务跟踪的解决方案,在分布式系统中提供追踪解决方案并且兼容支持了zipkin
二、搭建链路监控步骤
Zipkin下载: SpringCloud从F版起就已经不需要自己构建Zipkin Server了,只需调用jar包即可。
下载地址:
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
下载zipkin-server-2.12.9-exec.jar
运行jar
java -jar zipkin-server-2.12.9-exec.jar
访问:http://localhost:9411/zipkin/
完整的调用链路:
表示一请求链路,一条链路通过Trace Id唯一标识,Span标识发起的请求信息,各span 通过parent id关联起来
把上图精简一下:
术语:
- Span:基本工作单元,发送一个远程调度任务 就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另一个64位ID唯一标识的,Span还有其他数据信息,比如摘要、时间戳事件、Span的ID、以及进度ID。
- Trace:一系列Span组成的一个树状结构。请求一个微服务系统的API接口,这个API接口,需要调用多个微服务,调用每个微服务都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。
- Annotation:用来及时记录一个事件的,一些核心注解用来定义一个请求的开始和结束 。这些注解包括以下:
- cs - Client Sent -客户端发送一个请求,这个注解描述了这个Span的开始
- sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络传输的时间。
- ss - Server Sent (服务端发送响应)–该注解表明请求处理的完成(当请求返回客户端),如果ss的时间戳减去sr时间戳,就可以得到服务器请求的时间。
- cr - Client Received (客户端接收响应)-此时Span的结束,如果cr的时间戳减去cs时间戳便可以得到整个请求所消耗的时间。
简单的讲,Trance 类似于树结构的Span集合,表示一条调用链路,存在唯一标识
Span:表示调用链路来源,通俗的理解span就是一次请求信息。
Sleuth链路监控展示
三、修改服务提供者 cloud-provider-payment8001
3.1 pom文件
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
3.2 yml文件
zipkin:
base-url: http://localhost:9411
sleuth:
simpler:
probability: 1 #采样率值介于0到1之间,1则表示全部采集
3.3 修改业务类
业务类PaymentController添加
@GetMapping("/payment/zipkin")
public String paymentZipkin(){
return "hi,I'm paymentzipkin server fall back,O(∩_∩)O哈哈~";
}
四、修改 服务消费者(调用方)cloud-consumer-order80
4.1pom文件
<!--包含了sleuth+zipkin-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
4.2 application.yml文件
zipkin:
base-url: http://localhost:9411
sleuth:
sampler:
probability: 1
4.3 业务类
业务类OrderController中添加
@GetMapping("/consumer/payment/zipkin")
public String paymentZipkin(){
String result = restTemplate.getForObject("http://localhost:8001"+"/payment/zipkin/",String.class);
return result;
}
依次启动eureka7001,8001,80
http://localhost:8001/payment/zipkin
这里我们可以看到这个请求的整体耗时,点击这个请求,可以进入到详情页面,查看每个服务的耗时:
点击对应的服务,我们可以看到相应的访问时间,http请求类型、路径、IP、tranceID、spanId等内容,如下图:
github源代码地址:https://github.com/diligentkong/cloud2020