分布式服务+SkyWalking实现全链路追踪

分布式服务+SkyWalking实现全链路追踪

SkyWalking 是一款开源的 分布式链路追踪性能监控服务可观测性 平台,旨在帮助开发人员和运维团队监控和诊断分布式系统中的性能问题。它特别适用于微服务架构和云原生应用,可以对多个服务间的调用链路进行跟踪,收集服务性能数据,如响应时间、吞吐量、错误率等,从而帮助定位系统的性能瓶颈和故障。

1、SkyWalking 的功能:

  1. 分布式链路追踪:SkyWalking 能够追踪跨越多个服务的请求链路,记录请求的传播路径,识别出服务间的依赖关系。
  2. 服务性能监控:实时监控服务的性能指标,包括响应时间、QPS、错误率等,并且通过可视化界面展示。
  3. 日志、指标、追踪统一分析:提供对日志、追踪和监控指标的统一分析,帮助运维人员快速分析问题。
  4. 多种探针支持:支持 Java、.NET、Go、Node.js、Python 等多种语言,能够无缝集成到多种微服务架构中。
  5. 支持多种存储:SkyWalking 支持将采集的数据存储到多个不同的后端,如 ElasticsearchH2MySQLTiDB 等。

2、SkyWalking 的架构:

SkyWalking 的架构层次非常清晰,分为以下四个主要部分:

  1. 探针采集层:通过探针(Agent)采集应用的链路追踪信息和性能指标。
  2. 数据传输和逻辑处理层:负责接收、处理、分析链路数据,构建调用链路和服务依赖关系。
  3. 数据存储层:将采集到的链路追踪信息、性能指标和日志持久化存储,支持多种存储系统。
  4. 数据展示层:通过 Web UI 提供直观的链路追踪、服务拓扑图、性能监控和告警管理功能。

通过这四层架构,SkyWalking 提供了一个完整的分布式链路追踪和监控解决方案,能够帮助开发和运维团队在复杂的微服务系统中快速定位问题并优化系统性能。

1. 探针采集层(Agent Layer / Probes)

  • 作用:探针是部署在应用服务中的轻量级代理,负责采集应用的链路追踪信息、性能指标和日志信息。SkyWalking 支持多种语言的探针,包括 Java、Go、Node.js、Python 等。探针主要通过拦截应用的请求和响应,采集这些分布式请求的链路数据。
  • 工作原理:在应用的 JVM(或其他运行时环境)中运行时,探针会自动监控请求的入口(如 HTTP 请求、RPC 调用等)和出口(如数据库查询、服务调用等),记录请求的链路、延迟时间、错误情况,并通过 gRPC 或 HTTP 将数据发送给 SkyWalking 后端进行处理。
  • 支持的技术栈
    • Java 应用中常用的框架,如 Spring Boot、Spring Cloud、Dubbo、gRPC 等,都可以通过 SkyWalking Agent 进行链路跟踪。
    • 通过字节码增强技术(如 Java 的 ByteBuddy),探针可以在不修改业务代码的情况下无侵入地采集链路信息。

2. 数据传输和逻辑处理层(Collector Layer / Backend Services)

  • 作用:这一层主要负责从探针采集的数据接收、聚合和分析。在这个阶段,SkyWalking 后端会处理分布式链路追踪的调用数据,构建完整的调用链路,并进行指标计算、统计错误、生成服务依赖关系等信息。
  • 主要组件
    • Collector:负责从不同服务的探针(Agent)收集链路追踪数据和性能指标。通常通过 gRPC 协议进行通信。
    • Service Mesh:如果在服务网格(如 Istio、Envoy)中使用,SkyWalking 也支持与服务网格数据直接集成,收集来自网格的数据。
    • 分析和聚合:SkyWalking 后端服务会根据服务间的调用关系,进行链路聚合和依赖关系的分析。通过对性能数据的分析,识别出系统中的瓶颈点和高延迟部分。
  • 扩展性
    • 数据的处理逻辑是可扩展的,SkyWalking 可以通过自定义插件进行数据过滤和增强。
    • 支持多种传输协议,默认使用 gRPC 进行高效的二进制传输,也支持 HTTP 进行数据传输。

3. 数据存储层(Storage Layer)

  • 作用:数据存储层负责将链路追踪数据、性能指标和日志信息持久化。SkyWalking 支持多种后端存储系统,包括内存数据库 H2、Elasticsearch、MySQL、TiDB 等。不同的存储系统适用于不同规模的生产环境。
  • 主要存储类型
    • Elasticsearch:适合生产环境中大量数据的持久化存储,具备强大的查询和聚合能力,SkyWalking 的许多性能指标和链路数据都会存储在 ES 中。
    • MySQLTiDB:如果对存储查询要求不高,或有低延迟需求,也可以选择 MySQL 或 TiDB 进行数据存储。
    • H2:默认内存数据库,主要用于开发和测试场景,不适合大规模生产环境。
  • 扩展性
    • SkyWalking 的存储模块是可插拔的,支持通过插件方式接入不同的存储后端。开发者可以根据业务需求自定义存储方案,或者通过 SkyWalking 官方支持的存储插件进行扩展。

4. 数据展示层(UI Layer / Web UI)

  • 作用:数据展示层是可视化 SkyWalking 采集的链路追踪数据、性能指标、服务拓扑图和日志数据的地方。SkyWalking 提供了 Web UI 界面,帮助开发人员和运维团队直观了解系统的运行状态。
  • 主要功能
    • 链路追踪展示:展示分布式系统中完整的调用链路,帮助快速定位哪个服务存在延迟或出错。
    • 服务依赖拓扑图:展示服务之间的依赖关系,直观地反映服务间的调用情况和依赖链。
    • 性能指标监控:提供实时的服务响应时间、QPS、错误率等监控指标。
    • 告警管理:可以设置告警规则,当某个服务的性能指标异常(如高延迟、错误率高)时,触发告警。
  • 技术架构
    • Web 前端:基于现代前端框架(如 Vue.js)构建,提供交互友好的可视化界面。
    • API 服务:数据展示层通过后端 API 获取实时数据,API 服务会从数据存储层读取持久化的链路追踪和监控数据。

3、搭建SkyWalking

搭建 SkyWalking 主要包括以下步骤:下载与部署 SkyWalking 后端服务配置存储后端启动服务和 UI、以及在应用中集成 SkyWalking Agent。接下来我会详细介绍每一步如何操作。

步骤 1:下载 SkyWalking

  1. 下载 SkyWalking 安装包: 你可以从 Apache SkyWalking 官方网站 或其 GitHub Releases 页面下载最新版本的 SkyWalking。例如,使用以下命令下载最新版本(假设是 9.5.0 版本):wget https://downloads.apache.org/skywalking/9.5.0/apache-skywalking-apm-9.5.0.tar.gz
  2. 解压安装包tar -xzf apache-skywalking-apm-9.5.0.tar.gz cd apache-skywalking-apm-bin

步骤 2:配置存储后端

SkyWalking 支持多种数据存储后端,最常用的是 Elasticsearch,你也可以选择 MySQLTiDBH2(默认内存数据库)

Elasticsearch 作为存储后端(推荐生产环境)

如果你选择使用 Elasticsearch 作为存储后端,确保你的 Elasticsearch 已经安装并运行。

  • 编辑 config/application.yml 文件,找到以下部分,并配置你的 Elasticsearch 节点信息:
storage:
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}  # 你的 Elasticsearch 地址
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
使用 H2 内存数据库(适合测试环境)

H2 是 SkyWalking 默认的内存数据库,适合测试和开发环境。无需额外配置,你可以直接使用默认配置。

使用 MySQL 作为存储后端

如果你选择使用 MySQL,请确保 MySQL 运行并创建相应的数据库。然后在 config/application.yml 文件中配置 MySQL 信息:

storage:
  mysql:
    properties:
      jdbcUrl: "jdbc:mysql://localhost:3306/skywalking?useSSL=false&useUnicode=true&characterEncoding=UTF-8"
      dataSource.user: root
      dataSource.password: yourpassword

步骤 3:启动 SkyWalking 后端服务

启动 SkyWalking 后端服务: 进入 SkyWalking 解压目录,运行以下命令启动后端服务: ./bin/startup.sm

查看启动日志: 你可以通过以下命令查看 SkyWalking 的启动日志,确认是否成功启动:tail -f logs/skywalking-oap-server.log

此时使用jps命令,应该可以看到如下2个进程。一个是web页面进程,一个是接受和处理上报数据的进程。如果没有jps命令,那自行查看下是否配置了Java环境变量。


同时访问 http://ip:8080 应该可以看到如下界面:

步骤 4:在 Spring Boot 或 Spring Cloud 项目中集成 SkyWalking Agent

为了将应用的链路追踪数据发送到 SkyWalking 后端,你需要为应用添加 SkyWalking Agent。SkyWalking Agent 是一种轻量级探针,能够自动采集链路信息。

  1. 下载 SkyWalking Java Agent
    • SkyWalking 安装包中已经包含 agent 目录,里面有 skywalking-agent.jar。你需要将这个 Agent 部署到你的应用中。
    • Agent 路径:/apache-skywalking-apm-bin/agent/skywalking-agent.jar
  2. 配置应用启动参数
    • skywalking-agent.jar 上传到 Spring Boot 或 Spring Cloud 应用所在的服务器。
    • 修改应用的 JVM 启动参数,添加 -javaagent 配置,指定 Agent 的路径。例如,如果你的应用放在 /opt/skywalking/agent/ 目录下,你需要修改应用的启动脚本或 JVM 启动参数,添加以下内容:-javaagent:/opt/skywalking/agent/skywalking-agent.jar
  3. 配置 Agent 连接到 SkyWalking 后端
    • 修改 Agent 目录下的 config/agent.config 文件,指定 SkyWalking 后端的地址(通常是 OAP 服务的地址):
      collector.backend_service=localhost:11800 # SkyWalking 后端的 gRPC 端口
      agent.service_name=my-spring-boot-service # 你的服务名称,用于在 UI 中区分
  4. 启动 Spring Boot / Spring Cloud 应用:启动应用时,SkyWalking Agent 会自动启动,并通过 gRPC 将链路追踪数据发送到 SkyWalking 后端。
  5. 查看链路追踪结果:打开 SkyWalking 的 Web UI,进入Trace 页面,你可以看到 Spring Boot / Spring Cloud 应用的调用链路信息,包括响应时间、服务拓扑、性能指标等。

应用如果是Docker镜像的部署方式,则需要将skywalking-agent.jar打到镜像里,类似下图:

启动项目后,即可看到监控数据 。 关于UI界面详细指标解释可以参考这里:https://juejin.cn/post/7106307197763584030

注意事项和最佳实践:

  1. 性能开销
    • SkyWalking Agent 是一种轻量级的探针,但在高并发和大量请求的生产环境中,它会有一定的性能开销。建议先在测试环境中验证性能影响,确保不会对生产系统造成过大的性能损耗。
  2. 采样率配置
    • 默认情况下,SkyWalking 会采集所有链路数据。在高并发系统中,可以配置采样率,限制每秒钟采集的请求数,减轻对系统的影响。采样率可以在 agent.config 文件中配置:agent.sample_n_per_3_secs=1000 # 每3秒最多采样1000个请求
  3. 部署拓扑优化
    • 在大规模分布式系统中,建议将 SkyWalking 的后端服务和存储服务(如 Elasticsearch)分别部署在不同的节点上,以保证后端的稳定性和高可用性。
  4. 高可用性
    • 对于生产环境,可以考虑将 SkyWalking 后端服务(OAP)进行集群化部署,增加容错性和高可用性。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注