随着微服务架构的流行,一个请求可能会经过多个服务节点。在这样的系统中,传统的日志记录和监控手段已经不足以满足需求,因此需要一种更有效的工具来追踪请求在不同服务之间的流动情况。Zipkin 是一个开源的分布式追踪系统,它可以帮助开发者收集和分析分布式系统的延迟数据。
Zipkin 是由 Twitter 开发并开源的一个分布式追踪系统,主要用来收集服务的性能数据,并以可视化的方式展示出来。通过 Zipkin,开发者可以轻松地了解请求在各个服务间的流转情况,从而快速定位性能瓶颈和服务故障。
Zipkin 的核心概念包括:
首先确保你的开发环境已经安装了以下工具:
最简单的方式是通过 Docker 启动 Zipkin 服务:
docker run -d -p 9411:9411 openzipkin/zipkin
这将启动一个 Zipkin 服务,默认监听在 http://localhost:9411
。
如果你使用的是 Maven 构建工具,可以在 pom.xml
中添加以下依赖:
<dependency>
<groupId>io.zipkin.brave</groupId>
<artifactId>brave-instrumentation-spring-web</artifactId>
<version>5.13.2</version>
</dependency>
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter</artifactId>
<version>2.16.1</version>
</dependency>
如果是 Gradle,则添加以下内容:
implementation 'io.zipkin.brave:brave-instrumentation-spring-web:5.13.2'
implementation 'io.zipkin.reporter2:zipkin-reporter:2.16.1'
在 Spring Boot 应用中启用 Zipkin 追踪功能,可以通过以下步骤实现:
spring:
zipkin:
base-url: http://localhost:9411 # Zipkin 服务地址
sleuth:
sampler:
probability: 1.0 # 设置采样率为100%
在 Spring Boot 应用中创建一个配置类来初始化 Tracing Bean:
import brave.Tracing;
import brave.sampler.Sampler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TracingConfig {
@Bean
public Tracing tracing() {
return Tracing.newBuilder()
.sampler(Sampler.ALWAYS_SAMPLE) // 始终采样
.build();
}
}
假设你有两个微服务:Service A 和 Service B。Service A 调用 Service B 来完成某个任务。我们可以通过以下方式模拟这种场景:
@RestController
public class ServiceAController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/call-service-b")
public String callServiceB() {
return restTemplate.getForObject("http://localhost:8081/service-b", String.class);
}
}
@RestController
public class ServiceBController {
@GetMapping("/service-b")
public String serviceB() {
return "Response from Service B";
}
}
当访问 http://localhost:8080/call-service-b
时,Service A 会调用 Service B。此时,Zipkin 会记录整个请求的追踪信息。
打开浏览器访问 http://localhost:9411/zipkin/
,你应该能够看到类似如下的追踪信息:
在实际生产环境中,为了减少性能开销,通常不会对所有请求进行追踪。可以通过调整 spring.sleuth.sampler.probability
的值来设置采样率。例如,设置为 0.1
表示只追踪 10% 的请求。
默认情况下,Zipkin 使用内存存储追踪数据。对于生产环境,建议使用持久化存储,如 MySQL、Cassandra 或 Elasticsearch。可以通过以下配置启用持久化存储:
zipkin:
storage:
type: mysql
mysql:
host: localhost
port: 3306
username: zipkin
password: zipkin
Zipkin 可以与其他监控工具结合使用,如 Prometheus 和 Grafana。通过这种方式,可以更全面地监控系统的健康状况和性能指标。