SkyWalking原理详解

一、分布式追踪的基本原理

在传统的单体应用中,我们可以使用传统的日志来追踪应用程序的状态和行为。但是,随着微服务架构的流行,这种方式已经不再适用于现代应用程序。由于微服务架构的分散性和异步性,分布式追踪成为解决方案。分布式追踪在整个应用程序请求流中收集数据,并将其组织为可视化和可操作的形式。

分布式追踪系统的工作原理是当请求从一个服务传递到另一个服务时,它会传递一个“上下文”,这个上下文包含了一个全局唯一的标识符。该标识符跨越了所有的服务,这样就可以追踪整个分布式交互。指定的ID在所有节点之间传递,将在整个调用链中保持唯一。

在这种架构中,每个服务节点都应当实现分布式追踪,即在节点上收集性能数据并将它们发送到一个中央存储位置。

二、SkyWalking的架构和组件

SkyWalking是一种开源的分布式应用性能监测系统,它提供了实时的跟踪和诊断解决方案。SkyWalking通过一个中央控制台来展示应用程序的性能特征,并提供了一个详细的、分布式的跟踪工具箱。

SkyWalking系统主要由以下四个组成部分组成:

  • 探针(Probe):在应用程序中注入的代码,用于收集性能数据。
  • 收集器(Collector):用于收集和处理从探针发送来的数据,并提供一个中央化的数据库。
  • 存储层(Storage):用于持久化来自收集器的数据。
  • UI展示层(UI):用于展示数据和提供用户界面。

除此之外,SkyWalking还有语言特定的探针,如Java探针、.NET探针、Node.js探针等,以适应不同语言和平台的需求。同时,它也提供了针对不同框架和组件的支持,如Spring、Dubbo、OkHttp等。

三、SkyWalking的工作原理

在应用程序启动时,SkyWalking会通过类似代理的方式与应用程序绑定在一起,实现了对应用程序无侵入的监测。SkyWalking通过探针在应用程序中收集性能数据,并将其发送到收集器。

SkyWalking采用了分布式追踪的技术,在请求流传递时,传递唯一标识符,在发送请求和接收响应时,它都将标识符发送给调用对方的节点。如果一个服务所调用的其他服务也是用SkyWalking处理的,SkyWalking会自动收集这些服务产生的数据,形成完整的跟踪链路。

SkyWalking将分布式追踪数据存储到持久化的存储层中。存储层可以是关系型数据库,如MySQL和Oracle,也可以是NoSQL数据库,如Elasticsearch。

SkyWalking UI提供了一个可视化界面,用于查看和分析收集和聚合的数据。在UI中,可以轻松地跟踪整个请求链路,分析性能瓶颈以及事件的源和目标节点。

四、SkyWalking的样例代码

Java探针的样例代码

public static void main(String[] args) {
    // 创建全局Tracer,在此处Tracer的实现类为SkywalkingTracerImpl
    GlobalTracer.registerIfAbsent(new SkywalkingTracerImpl());
 
    // 开始新的调用SPAN
    Span span = GlobalTracer.get().buildSpan("message service").start();
    span.setTag("span.tag", "value");
 
    // 在SPAN中添加另一种类型的SPAN
    GlobalTracer.get().buildSpan("cache.set").asChildOf(span).withTag("span.tag", "value").start().finish();
 
    try {
        Thread.sleep(400);
    } catch (InterruptedException e) {
        span.log(e.getMessage());
    }
 
    // 结束调用SPAN
    span.finish();
}

Collector的样例代码

使用SkyWalking从Spring微服务中收集数据

以下是一个基于Spring微服务框架的Collector示例代码,它收集节点接收到的所有请求数据,并将这些数据存储在Elasticsearch中:

spring:
  application:
    name: my-microservice
  cloud:
    skywalking:
      agent:
        enabled: true
  sleuth:
    enabled: false
    
logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} - [%15.15t] %-5level %logger{36} - %msg%n'

server:
  port: 8080

eureka:
  instance:
    hostname: localhost
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

management:
  endpoints:
    web:
      exposure:
        include: health,info,env
  
  ```

存储层的样例代码

基于MySQL持久化数据

以下是SkyWalking存储层的一个简单示例,通过使用MySQL进行跟踪数据的持久化存储。

CREATE TABLE `trace` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `trace_id` varchar(128) NOT NULL,
  `segment_id` varchar(128) NOT NULL,
  `start_time` bigint(20) NOT NULL,
  `spans` text NOT NULL,
  `duration` int(11) NOT NULL,
  `endpoint_name` varchar(191) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_traceid_duration_starttime` (`trace_id`,`duration`,`start_time`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

五、SkyWalking的优点

SkyWalking的主要优点包括以下几个方面:

  • 提供完整的分布式追踪功能,帮助开发人员更好地理解应用程序的性能问题。
  • 支持不同的编程语言和平台,并提供了对不同框架和组件的支持。
  • 利用开源社区成员的力量,获取了大量的资源和支持。
  • 提供了功能完整的中央化控制台,方便用户集中管理监测数据。

六、结语

在现代分布式应用程序中,性能监测和调试是一个关键的话题。SkyWalking是一种强大的性能监测工具,它提供了分布式追踪、应用程序拓扑和性能分析等功能。本文介绍了SkyWalking的基本原理和架构,同时也给出了Java探针、Collector和存储层的样例代码。SkyWalking的优点包括支持不同的开发语言和框架、具有完备的功能并且有活跃的社区支持。

原创文章,作者:ZDRYM,如若转载,请注明出处:https://www.506064.com/n/370229.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZDRYMZDRYM
上一篇 2025-04-18 13:40
下一篇 2025-04-18 13:40

相关推荐

  • Harris角点检测算法原理与实现

    本文将从多个方面对Harris角点检测算法进行详细的阐述,包括算法原理、实现步骤、代码实现等。 一、Harris角点检测算法原理 Harris角点检测算法是一种经典的计算机视觉算法…

    编程 2025-04-29
  • 瘦脸算法 Python 原理与实现

    本文将从多个方面详细阐述瘦脸算法 Python 实现的原理和方法,包括该算法的意义、流程、代码实现、优化等内容。 一、算法意义 随着科技的发展,瘦脸算法已经成为了人们修图中不可缺少…

    编程 2025-04-29
  • 神经网络BP算法原理

    本文将从多个方面对神经网络BP算法原理进行详细阐述,并给出完整的代码示例。 一、BP算法简介 BP算法是一种常用的神经网络训练算法,其全称为反向传播算法。BP算法的基本思想是通过正…

    编程 2025-04-29
  • GloVe词向量:从原理到应用

    本文将从多个方面对GloVe词向量进行详细的阐述,包括其原理、优缺点、应用以及代码实现。如果你对词向量感兴趣,那么这篇文章将会是一次很好的学习体验。 一、原理 GloVe(Glob…

    编程 2025-04-27
  • 编译原理语法分析思维导图

    本文将从以下几个方面详细阐述编译原理语法分析思维导图: 一、语法分析介绍 1.1 语法分析的定义 语法分析是编译器中将输入的字符流转换成抽象语法树的一个过程。该过程的目的是确保输入…

    编程 2025-04-27
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25

发表回复

登录后才能评论