Zipkin 架构与使用

Zipkin 是 Twitter 开源的分布式追踪系统,比 Jaeger 更早出现(2012 年),是链路追踪领域的先驱。虽然近年来 OpenTelemetry 和 Jaeger 的热度更高,Zipkin 仍然在 Java 生态(尤其是 Spring Boot 应用)中拥有大量用户。

Zipkin 的设计哲学是简单至上:它追求极简的架构和极低的门槛,适合中小规模的追踪场景。对于需要轻量化追踪能力的团队,Zipkin 是一个值得考虑的选择。

架构组成

Zipkin 分为四个组件:

Collector:接收来自客户端的追踪数据,支持 HTTP 和 Kafka 两种传输方式。Collector 验证数据格式后写入存储层。

Storage:Zipkin 支持多种存储后端:内存(开发测试用)、MySQL、Cassandra、Elasticsearch。生产环境推荐 Elasticsearch 或 Cassandra。

API:提供 RESTful API 供 UI 和其他客户端查询 Trace 数据。API 支持按 TraceID 查询、时间范围查询、服务名过滤等。

Web UI:基于 AngularJS 的单页应用,提供 Trace 列表、瀑布图、依赖图等可视化功能。UI 界面相比 Jaeger 较为朴素。

轻量级优势

相比 Jaeger 和Tempo,Zipkin 的优势在于轻量

部署简单:All-in-One 模式只需一个 JAR 包,Docker 一条命令即可启动。相比 Jaeger 需要部署 Agent/Collector/Query 多组件,Zipkin 的运维复杂度更低。

资源占用低:Zipkin 的资源消耗约为 Jaeger 的 1/3 到 1/2。对于中小规模部署(Trace 量 < 1000 QPS),Zipkin 的性价比很高。

Spring Boot 原生集成:Spring Cloud Sleuth 是 Spring Cloud 的追踪组件,内置集成 Zipkin。配置 spring.zipkin.base-url 即可自动将追踪数据发送到 Zipkin,无需额外编码。

Spring Boot 集成示例

# application.yml
spring:
  zipkin:
    base-url: http://zipkin:9411
  sleuth:
    sampler:
      probability: 0.1  # 10% 采样率
// Spring Boot 自动配置,无需额外代码
@RestController
public class OrderController {
    
    @Autowired
    private Tracer tracer;  // Spring Cloud Sleuth 提供的 Tracer
    
    @GetMapping("/order/{id}")
    public Order getOrder(@PathVariable String id) {
        // 自动记录 HTTP 请求的 Span
        // 也可以手动创建子 Span
        Span span = tracer.next().name("process-order").start();
        try {
            return orderService.getOrder(id);
        } finally {
            span.end();
        }
    }
}

局限性

Zipkin 的主要局限是功能相对基础:

不支持 OTLP:Zipkin 使用自己的传输协议,不支持 OTLP 协议。如果想将数据发送到 Jaeger 或 Grafana Tempo,需要额外转换。

采样策略有限:Zipkin 的采样策略比 Jaeger 简单,不支持尾部采样、基于错误的采样等高级策略。

生态有限:相比 OpenTelemetry 的多语言支持,Zipkin 的 SDK 主要面向 Java 生态,多语言支持较弱。

对于新项目,推荐使用 OpenTelemetry + Jaeger/Tempo 的组合;对于已使用 Spring Cloud 的存量项目,Zipkin + Spring Cloud Sleuth 仍然是一个稳定的选择。