学习笔记—微服务—技术栈实践(8)—链路追踪

为什么需要链路追踪

  前文中有提到,微服务会把项目拆分,导致系统服务间的调用链路变得相当复杂,那么一个前端请求可能最终需要调用多个后端服务才能实现,当前端发起一个请求后,调用链路可能会非常复杂,比如A->B->C->D->B->C->O这样一条长长的链路才能获得所需要的调用,当整个请求出现不可用的时候,怎么知道是在哪一个服务端引发的问题呢?

  很难确定,因此,跟进一个请求到底有哪些服务参与,参与的顺序怎么样,是非常关键的。

  这也是为什么需要分布式链路追踪系统的原因。

链路追踪技术选型

  链路追踪其实已经不算是新兴的概念和技术了,可以使用的组件非常多,比如sleuth、sky walking、zipkin、阿里鹰眼等等。

 &emsp这些组件有一个共同的名字就是APM工具,Application Performance Management,换言之就是应用性能监控工具。

  于此,介绍两种解决方案,分别为zipkin+sleuth和skywalking。

zipkin+sleuth

什么是Zipkin和Sleuth

  Zipkin 和 Sleuth 是分布式追踪(Distributed Tracing)技术栈中的两个关键组件,通常用于监控微服务系统中跨服务的请求调用链。它们能够帮助开发者追踪请求在多个微服务中的流转路径,进而分析性能瓶颈和故障。它们的组合在 Spring Cloud 微服务架构中使用广泛。

  Zipkin 是一个开源的分布式追踪系统,最初由 Twitter 开发。它负责收集、存储、分析和展示分布式系统中的调用链信息。通过收集来自不同微服务的追踪数据,Zipkin 可以帮助你了解一个请求的完整生命周期,精确地找到延迟较高的服务。

  Sleuth 是 Spring Cloud 提供的一个分布式追踪解决方案,它为 Spring 应用提供了透明的追踪支持。Sleuth 与 Zipkin 搭配使用时,能够自动为请求生成追踪信息,并将这些追踪数据发送到 Zipkin。

  换言之,zipkin负责收集和储存追踪信息(traces),并且提供web UI,提供REST API允许其他用户访问追踪数据,sleuth则是生成traceId等内容,并传播。

  Sleuth 自动收集追踪数据,并将这些数据格式化为 Zipkin 所识别的格式。

  Sleuth 将采集到的数据通过 HTTP 或者消息队列(如 Kafka)发送到 Zipkin 服务端。

  Zipkin 收集到 Sleuth 发送的追踪数据后,存储并对其进行分析和可视化展示。

Sleuth+Zipkin的使用

  首先,需要有Zipkin,以docker为例:

1
docker run -d -p 9411:9411 openzipkin/zipkin

  其次,需要在pom中加入spring cloud sleuth和zipkin的依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
<dependencies>
<!-- Spring Cloud Sleuth -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

<!-- Sleuth + Zipkin -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
</dependencies>

  在application中配置sleuth将追踪数据发送到zipkin服务器上:

1
2
3
4
5
6
7
spring:
zipkin:
base-url: http://localhost:9411 # Zipkin 服务器的地址
enabled: true
sleuth:
sampler:
probability: 1.0 # 采样率,1.0 表示采集所有请求的追踪数据

  启动 Spring Boot 应用后,Sleuth 会自动为每个请求生成追踪信息,并发送到 Zipkin 服务器。你可以在 Zipkin 的 Web UI 中查看到服务间的调用链。

  需要注意的是,在较新的版本中,Spring Cloud Sleuth 项目被彻底移除了,被迁移到了 Micrometer 这些相关项目,此外,对代码也有一定的侵入性,好在比较轻量级。

Skywalking

什么是Skywalking

  Skywalking是属于Apache旗下的一个开源项目,提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

  比起前面的zipkin等,这个东西较为新兴一点,有多种监控手段多语言自动探针,社区活跃支持告警,同时对代码的侵入性也非常小,只需要植入探针即可。

Skywalking的组成

  skywalking可以看作有以下几个部分组成:

探针(Agent)

  探针是部署在应用程序中的轻量级组件,用于收集应用程序的运行数据。SkyWalking 提供多种语言的探针(如 Java、C++、Node.js 等),这些探针能够自动监控应用程序的性能,收集跟踪信息、指标数据等,并发送到后端的接收器。

OAP服务

  OAP 是 SkyWalking 的核心组件,负责接收来自探针的数据,进行分析和处理。这是整个系统的数据处理和存储中心。在数据处理上,接收探针发送的跟踪数据、日志数据和指标数据,进行存储、聚合和分析。

  在可拓展性上,支持插件机制,用户可以根据需求扩展 SkyWalking 的功能,比如添加新的存储后端或自定义分析逻辑。

  在储存系统上,支持多种存储后端,包括 Elasticsearch、H2、MySQL、TiDB 等,用于持久化监控数据。

存储层

  存储层是 SkyWalking 的数据持久化组件,负责存储 OAP 服务处理后的数据。SkyWalking 支持多种存储后端,包括 Elasticsearch、H2、MySQL、TiDB 等,用户可以根据需求选择合适的存储后端。

UI界面

  UI界面是 SkyWalking 的用户界面,用于展示监控数据和指标。它提供了一个直观的界面,让用户可以查看和分析应用程序的性能,包括跟踪数据、服务拓扑、性能指标等。

Skywalking的安装

  此处采用Docker的方式对Skywalking进行安装。

  以S可以walking9.2.0的一个简单的安装启动方法为例,首先要拉去oap和ui:

1
2
docker pull apache/skywalking-oap-server:9.2.0
docker pull apache/skywalking-ui:9.2.0

  在此基础上启动:

1
2
// 启动oap
docker run --name skywalking-oap -e TZ=Asia/Shanghai -p 12800:12800 -p 11800:11800 --restart always -d apache/skywalking-oap-server:9.2.0
1
2
3
4
5
6
7
8
// 启动ui
docker run -d --name skywalking-ui \
--restart=always \
-e TZ=Asia/Shanghai \
-p 8088:8080 \
--link skywalking-oap:oap \
-e SW_OAP_ADDRESS=http://192.168.1.13:12800 \
apache/skywalking-ui:9.2.0

  当然,也可以采用elasticsearch等来作为skywalking的储存工具,将默认的H2储存库进行修改。

Skywalking的使用

Java中的使用

  在Java上的使用是很容易的。

  首先,对于Jar包来说,首先,进入skywalking的官方发布界面下载完整的agent包,https://skywalking.apache.org/downloads/

  通常目录结构是这样的:

1
2
3
agent/
├── skywalking-agent.jar
└── config/

  在启动 Java 应用时,使用 -javaagent 参数将 SkyWalking Agent 附加到应用中。假设你已经下载并解压了 SkyWalking Agent:

1
java -javaagent:/path/to/skywalking-agent.jar -Dskywalking.agent.service_name=your-service-name -Dskywalking.collector.backend_service=skywalking-backend-ip:port -jar your-application.jar

  -javaagent:指定 SkyWalking Agent JAR 的路径。

  -Dskywalking.agent.service_name:设置服务名称,在 SkyWalking UI 中展示此服务的监控数据。

  -Dskywalking.collector.backend_service:指定 SkyWalking OAP 服务的地址,通常是 skywalking-backend-ip:port。

  此外,在config文件中,也可以根据一些设置修改默认的一些配置,比如日志级别,默认是INFO的。

Python中的使用

  在python上的使用也是非常容易的。

  首先,skywalking提供的有python的探针包:

1
pip install apache-skywalking

  随后,可以初始化探针在程序入口:

1
2
3
4
5
6
7
8
from skywalking import agent, config

# 配置 SkyWalking
config.service_name = 'your-python-service'
config.collector_address = 'skywalking-backend-ip:port'

# 启动 SkyWalking Agent
agent.start()

  而后便可集成,两者均需要正确的OAP后端的IP和端口,来确保数据可以被正确的收集和展示。


学习笔记—微服务—技术栈实践(8)—链路追踪
https://gagaducko.github.io/2024/09/15/学习笔记—微服务—技术栈实践-8-—链路追踪/
作者
gagaduck
发布于
2024年9月15日
许可协议