Spring Boot中的Zipkin:分布式跟踪系统
简介
在现代的分布式应用程序中,由于业务逻辑被分解为多个微服务,因此我们需要跟踪每个服务的性能和行为。Zipkin是一个分布式跟踪系统,它可以帮助我们收集、存储和分析跨越多个服务的请求。本文将介绍Spring Boot中的Zipkin,它如何帮助我们跟踪分布式应用程序,并介绍如何使用Zipkin。
Zipkin介绍
Zipkin是一个开源的分布式跟踪系统,它可以帮助我们跟踪多个服务之间的请求。Zipkin通过使用Google Dapper的开放标准,将跨越多个服务的请求进行追踪,并将结果可视化展示出来。Zipkin可以帮助我们发现应用程序中的慢请求,并帮助我们调试和优化性能问题。
Zipkin的架构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l78ATkP4-1688528173532)(https://zipkin.io/pages/architecture.png)]
Zipkin包含以下组件:
- Collector:用于收集跟踪信息的组件。
- Storage:用于存储跟踪信息的组件。
- Search:用于搜索跟踪信息的组件。
- API:用于查询跟踪信息的API。
- UI:用于可视化展示跟踪信息的Web界面。
Zipkin与Spring Boot集成
Spring Boot提供了对Zipkin的集成支持,通过添加Spring Cloud Sleuth和Zipkin Client的依赖来实现。Spring Cloud Sleuth是一个分布式跟踪解决方案,它可以帮助我们跟踪应用程序中的请求。Zipkin Client是一个Zipkin的客户端,它可以帮助我们将跟踪信息发送到Zipkin Server中。
添加依赖
首先,我们需要在pom.xml文件中添加以下依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency>
配置Zipkin Server
Zipkin Server是一个用于存储和查询跟踪信息的中央存储库。我们需要配置Zipkin Server的URL,以便Sleuth可以将跟踪信息发送到Zipkin Server中。在application.properties文件中添加以下配置:
spring.zipkin.base-url=http://localhost:9411/
配置应用程序
我们需要在应用程序中添加一些配置,以便将跟踪信息发送到Zipkin Server中。在application.properties文件中添加以下配置:
spring.application.name=my-app spring.sleuth.sampler.probability=1.0
在上面的配置中,我们指定了应用程序的名称为my-app。我们还指定了采样率为100%。
启动Zipkin Server和应用程序
在完成上述配置之后,我们需要启动Zipkin Server和应用程序。Zipkin Server默认监听9411端口,我们可以使用以下命令来启动Zipkin Server:
$ java -jar zipkin-server-2.23.2-exec.jar
在启动应用程序之前,我们需要确保应用程序的所有依赖项都已经添加到pom.xml文件中。然后,我们可以使用以下命令来启动应用程序:
$ java -jar my-app.jar
验证Zipkin跟踪
在我们启动应用程序之后,我们可以访问Zipkin的Web界面,以查看应用程序的跟踪信息。我们可以使用以下URL来访问Zipkin的Web界面:
http://localhost:9411/zipkin/
在Web界面中,我们可以看到所有的跟踪信息,我们可以根据跟踪信息的ID来查看每个请求的详细信息和时间线。以下是一个示例跟踪信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-koHKXsTk-1688528173543)(https://zipkin.io/pages/traces.png)]
在上图中,我们可以看到一个跨越两个服务的请求的时间线。我们可以看到每个请求的开始时间、结束时间、持续时间和调用的服务名称。我们还可以查看每个服务的详细信息,包括请求的URL、请求参数、响应时间和响应代码等。
示例代码
下面是一个简单的Spring Boot应用程序,它演示了如何使用Zipkin进行分布式跟踪。在这个应用程序中,我们有两个服务:hello-service和world-service。当我们向hello-service发送一个请求时,它会向world-service发送一个请求,并返回一个响应。
pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> </dependencies>
application.properties
spring.application.name=hello-world-app server.port=8080 spring.zipkin.base-url=http://localhost:9411/ spring.sleuth.sampler.probability=1.0
HelloController.java
@RestController public class HelloController { private final RestTemplate restTemplate; public HelloController(RestTemplate restTemplate) { this.restTemplate = restTemplate; } @GetMapping("/hello") public String hello() { String response = restTemplate.getForObject("http://localhost:8081/world", String.class); return "Hello " + response; } }
WorldController.java
@RestController public class WorldController { @GetMapping("/world") public String world() { return "World"; } }
在上面的示例中,我们使用了Spring Boot的@RestController注解来定义HelloController和WorldController。我们使用了Spring Cloud Sleuth的RestTemplate来发送HTTP请求,并将跟踪信息添加到请求头中。
结论
在现代的分布式应用程序中,跟踪请求是非常重要的。Zipkin是一个开源的分布式跟踪系统,它可以帮助我们收集、存储和分析跨越多个服务的请求。在Spring Boot中,我们可以使用Spring Cloud Sleuth和Zipkin Client来集成Zipkin。通过使用Zipkin,我们可以发现应用程序中的慢请求,并帮助我们调试和优化性能问题。