zipkin 是一个分布式跟踪系统,它有助于收集服务架构中排除延迟问题所需的定时数据,其功能包括收集和查询这些数据。
介绍
- Zipkin 是一个开源的分布式跟踪系统,由 Twitter 开发并开源。它的主要作用是帮助开发者收集、存储、查询和可视化微服务架构中不同服务之间的请求链路信息。在复杂的分布式系统中,一个请求可能经过多个服务,每个服务又可能调用其他服务,这使得排查问题变得非常困难。Zipkin 就像是一个
侦探
,追踪请求的整个生命周期,为你呈现清晰的调用关系图,让你能快速定位性能瓶颈和故障点。
- zipkin 使用 Java 开发,推荐使用 Jaeger
上图转载自,要理解 Zipkin,需要先了解几个核心概念:
Zipkin Collector
Zipkin 收集器,用于收集/管理链路的追踪信息
Storage
Zipkin 数据存储,支持 Cassandra、ElasticSearch 和 MySQL 等第三方存储
Zipkin Query Service
数据存储并建立索引后,用于查找和检索跟踪信息
Web UI
数据查询与前端界面展示
- Span (跨度):Zipkin 中的基本工作单元,代表了一个逻辑工作单元,比如一次远程调用、一个方法执行或一次数据库查询。一个 Span 包含操作名称、时间戳、持续时间以及一些元数据(如 IP 地址、端口等)。每个 Span 都有一个唯一的 ID。
- Trace (追踪):由一系列有父子关系的 Span 组成的树状结构,代表了从一个请求进入系统到最终返回的完整调用链路。所有的 Span 共享同一个 Trace ID。
- Annotation (注解):用于记录时间事件,提供了更精细的上下文信息。例如,
cs
(Client Send, 客户端发送请求)、cr
(Client Receive, 客户端接收响应)、sr
(Server Receive, 服务端接收请求) 和 ss
(Server Send, 服务端发送响应) 等。
Zipkin 的工作原理
Zipkin 的工作流程通常分为以下几个步骤:
- 数据采集 (Data Collection):当一个请求进入分布式系统时,在每个服务中,埋点(Instrumentation)库会为这个请求创建一个新的 Span,并与 Trace ID 关联起来。
- 数据传输 (Data Transport):Span 数据被异步发送到 Zipkin Collector(收集器)。通常使用 HTTP 或 Kafka 等方式。
- 数据存储 (Data Storage):Collector 接收到 Span 数据后,将其存储到后端存储中,如 Elasticsearch、Cassandra 或 MySQL。
- 数据查询 (Data Query):Zipkin 的 API 服务器提供查询接口,允许用户根据 Trace ID、服务名称或时间范围等条件查询特定的 Trace。
- 数据可视化 (Data Visualization):Zipkin UI 提供了一个直观的 Web 界面,将查询到的 Trace 数据以图形化的方式展示出来,比如甘特图,清晰地显示出每个服务调用的时间线和依赖关系。
Zipkin 的作用和优势
- 性能分析:通过查看调用链中每个 Span 的持续时间,你可以轻松找出哪个服务或操作是性能瓶颈。
- 故障排查:当某个请求失败时,通过 Trace ID 追溯整个调用链路,可以快速定位是哪个服务出了问题。
- 服务依赖分析:Zipkin 可以生成服务依赖图,让你清楚地看到服务之间的调用关系,这对于理解复杂的微服务架构非常有帮助。
- 架构透明性:为开发者提供了一个
黑盒
的可视化窗口,让原本不可见的内部调用变得透明化。
安装
jar
curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar
docker
docker run -d -p 9411:9411 openzipkin/zipkin
kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
name: zipkin
namespace: istio-system
labels:
app: zipkin
spec:
selector:
matchLabels:
app: zipkin
template:
metadata:
labels:
app: zipkin
sidecar.istio.io/inject: "false"
spec:
containers:
- name: zipkin
image: openzipkin/zipkin-slim:3.4.0
env:
- name: STORAGE_METHOD
value: "mem"
readinessProbe:
httpGet:
path: /health
port: 9411
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: tracing
namespace: istio-system
labels:
app: zipkin
spec:
type: ClusterIP
ports:
- name: http-query
port: 80
protocol: TCP
targetPort: 9411
selector:
app: zipkin
---
apiVersion: v1
kind: Service
metadata:
labels:
name: zipkin
name: zipkin
namespace: istio-system
spec:
ports:
- port: 9411
targetPort: 9411
name: http-query
selector:
app: zipkin
kubectl apply -f samples/addons/extras/zipkin.yaml