您的位置:

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的优点包括支持不同的开发语言和框架、具有完备的功能并且有活跃的社区支持。