在项目中使用Zipkin--链路追踪
右边线框内代表了Zipkin的服务端,其中各组件的功能如下:
zipkin-client端 client需要有多个,本篇只拿一个进行举例。
启动工程打开浏览器访问:http://localhost:9412/
zipkin简介
随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构和容器技术的兴起,看似简单的应用,后台可能有几十个甚至几百个服务在支撑;一个前端的请求可能需要多次的服务调用最后才能完成;当请求变慢或者不可用时,我们无法得知是哪个后台服务引起的,这时就需要解决如何快速定位服务故障点,Zipkin分布式跟踪系统就能很好的解决这样的问题。
zipkin基本概念
1.Span:每个服务的处理跟踪是一个Span,可以理解为一个基本的工作单元。
2.Trace:一组Span的集合,表示一条调用链路。举个例子:当前存在服务A调用服务B然后调用服务C,这个A->B->C的链路就是一条Trace,而每个服务例如B就是一个Span,如果在服务B中另起2个线程分别调用了D、E,那么D、E就是B的子Span。Trace结构表示对一次请求的跟踪,一次请求可能由后台的若干服务负责处理,每个服务的处理是一个Span,Span之间有依赖关系,Trace就是树结构的Span集合;
3.Transport:收集的Spans必须从被追踪的服务运输到Zipkin collector,有三个主要的传输方式:HTTP, Kafka和Scribe;
4.Components:有4个组件组成Zipkin:collector,storage,search,web UI
运行关系图
左边部分代表了客户端分别为:
1.InstrumentedClient:使用了Zipkin客户端工具的服务调用方
2.InstrumentedServer:使用了Zipkin客户端工具的服务提供方
3.Non-InstrumentedServer:未使用Trace工具的服务提供方,当然还可能存在未使用工具的调用方
总结:一个调用链路是贯穿InstrumentedClient->InstrumentedServer的,每经过一个服务都会以Span的形式通过Transport把经过自身的请求上报的Zipkin服务端中
右边线框内代表了Zipkin的服务端,其中各组件的功能如下:
1.UI:提供web页面,用来展示Zipkin中的调用链和系统依赖关系等
2.Collector:对各个客户端暴露,负责接受调用数据,支持HTTP、MQ等
3.Storage:负责与各个存储适配后存储数据,支持内存,MySQL,ES等
4.API:为web界面提供查询存储中的数据的接口
在项目中使用Zipkin
zipkin-server端
1.导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--zipkin服务端所需的依赖-->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>2.12.3</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>2.12.3</version>
</dependency>
</dependencies>
2. 编写配置文件
server:
port: 9412
#zipkin启动报错无法访问的解决方法
management:
metrics:
web:
server:
auto-time-requests: false
3.创建引导类
/**
* @Author: Promsing(张有博)
* @Date: 2021/7/23 - 10:33
* @Description: Zipkin的服务端
* @version: 1.0
*/
@SpringBootApplication
@EnableZipkinServer //zipkin的注解
public class ZipkinApplication {
public static void main(String[] args) {
SpringApplication.run(ZipkinApplication.class,args);
}
}
zipkin-client端 -- client需要有多个,本篇只拿一个进行举例。
1.引入依赖
<!--Zipkin的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
2.编写配置文件
spring:
cloud:
application:
name: video
zipkin:
base-url: http://localhost:9412
3.创建引导类
@SpringBootApplication
public class VideoApplication {
public static void main(String[] args) {
SpringApplication.run(VideoApplication.class,args);
}
}
4.写一个服务之间相互调用的接口
使用到openFeign--只是示例,没有业务代码
@ApiOperation(value = "feign测试")
@GetMapping("/queryFeign")
public Result queryFeign(){
System.out.println("screen通过Feign调取project成功");
return Result.build(Result.SUCCESS,"查询成功");
}
其他的zipkin-client端 ,可按照以上四步去做