Jaeger 架构概览
介绍
Jaeger 是一个开源的分布式追踪系统,由 Uber 开发并贡献给云原生计算基金会(CNCF)。它用于监控和排查微服务架构中的复杂事务。本文将介绍 Jaeger 的核心架构组件及其协作方式,帮助你理解其设计哲学和实际应用场景。
Jaeger 核心组件
Jaeger 的架构主要由以下组件构成:
- Client SDK:集成到应用程序中,负责生成追踪数据(Spans)。
- Agent:接收客户端发送的追踪数据,并转发给 Collector。
- Collector:接收、验证和处理追踪数据,然后存储到后端。
- Storage:持久化存储追踪数据(如 Cassandra、Elasticsearch 等)。
- Query Service:提供 API 和 UI 查询追踪数据。
- UI:可视化展示追踪结果。
1. Client SDK
Client SDK 是集成到应用程序中的库,支持多种语言(如 Go、Java、Python 等)。它负责生成 Spans(追踪的基本单元),并将它们发送到 Jaeger Agent。
备注
Span 是 Jaeger 中的基本概念,代表一个独立的工作单元(如 HTTP 请求或数据库调用)。
示例代码(Go):
go
import (
"github.com/uber/jaeger-client-go"
"github.com/uber/jaeger-client-go/config"
)
func initTracer() (opentracing.Tracer, io.Closer) {
cfg := config.Configuration{
ServiceName: "my-service",
Sampler: &config.SamplerConfig{
Type: "const",
Param: 1,
},
}
tracer, closer, err := cfg.NewTracer()
if err != nil {
panic(err)
}
return tracer, closer
}
2. Agent
Agent 是一个轻量级的守护进程,通常部署在应用服务器上。它接收来自 Client SDK 的 Spans,并通过 UDP 协议批量转发给 Collector。
提示
Agent 的设计减少了客户端与 Collector 的直接耦合,提高了系统的可扩展性。
3. Collector
Collector 负责接收 Agent 发送的 Spans,并进行以下操作:
- 验证:检查 Span 数据的完整性。
- 处理:执行采样、过滤或转换。
- 存储:将数据写入后端存储(如 Cassandra 或 Elasticsearch)。
4. Storage
Jaeger 支持多种存储后端:
- Cassandra:适合高写入负载的场景。
- Elasticsearch:支持全文搜索和复杂查询。
- 内存存储:仅用于开发和测试。
5. Query Service 和 UI
Query Service 提供 REST API 查询追踪数据,UI 则通过可视化界面展示调用链和性能指标。
实际应用场景
假设一个电商平台的订单服务调用支付服务和库存服务。通过 Jaeger,可以追踪整个请求流:
- 用户下单 → 订单服务生成 Span。
- 订单服务调用支付服务 → 生成子 Span。
- 支付服务调用库存服务 → 生成子 Span。
总结
Jaeger 的架构设计解耦了数据生成、传输、存储和展示,使其能够高效处理大规模分布式系统的追踪需求。关键组件包括:
- Client SDK 生成 Spans。
- Agent 和 Collector 处理数据传输。
- Storage 持久化数据。
- Query Service 和 UI 提供查询和可视化。
附加资源
- Jaeger 官方文档
- 练习:尝试在本地部署 Jaeger 并追踪一个简单的微服务应用。