Skywalking链路追踪深度解析

一、Skywalking链路追踪概述

Skywalking是一款全面的分布式系统监控解决方案,它能够监控Spring、Dubbo、Spring Cloud、gRPC、.NET Core等多种服务类型,可以完全覆盖不同复杂程度的分布式应用程序。在Skywalking中,链路追踪是非常核心的一部分,通过链路追踪可以详细了解服务调用的每个节点、延迟和调用关系,有助于排查故障和优化性能。

二、Skywalking链路追踪原理

Skywalking采用的是追踪点的方式来实现链路追踪,它在分布式应用程序的关键节点上埋入了追踪点,通过在服务调用时请求追踪点去生成Span(各个服务向追踪点发送的请求和响应),同时在每个Span中嵌入Trace(整个追踪的根节点)。这样,就可以构建出完整的调用链路,包含每个服务的调用情况和调用耗时。


Trace
└── Span(服务A)
    ├── Span(服务B)
    │   ├── Span(服务C)
    │   └── Span(服务D)
    ├── Span(服务C)
    └── Span(服务D)

三、Skywalking链路追踪实践

1、通过Skywalking进行服务调用链路追踪

首先,需要在应用程序(Java应用)中添加Skywalking的Agent依赖,并配置统一的Agent Server地址。然后,在需要进行链路追踪的代码中添加Skywalking提供的Tracing API。


import org.apache.skywalking.apm.toolkit.trace.Trace;

public class ServiceA {
    @Trace
    public void callServiceB() {
        ...
    }
}

2、Skywalking链路追踪中的Tag和Log

除了默认的Span信息和Metrics信息外,Skywalking还支持自定义添加Tag和Log信息,这是非常有用的一种方式,可以在业务代码中打出一定的标记,方便后续排查问题。

添加Tag信息


Tracer tracer = TracingContextManager.get().getTracer();
tracer.tag("key", "value");

添加Log信息


Tracer tracer = TracingContextManager.get().getTracer();
tracer.log("log message");

3、通过Skywalking实现服务调用性能优化

Skywalking可以通过支持的多种插件来获取更多的性能数据,比如数据库连接池插件、Redis插件等。通过不同的插件,可以深入到底层,了解应用程序的性能瓶颈,从而进行调优。

四、Skywalking链路追踪中的常见问题及解决方案

1、Skywalking无法追踪到Web请求

解决方案:需要在应用程序中添加Skywalking针对Web请求的Filter,以保证能够追踪Web请求。


import org.apache.skywalking.apm.toolkit.trace.TraceCrossThread;

public class WebRequestFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        TracingContext tracingContext = TracingContextManager.getContext();
        if (tracingContext == null) {
            return;
        }
        Tracer tracer = tracingContext.getTracer();
        TraceCrossThread traceCrossThread = tracer.buildSpan("HttpRequest").startActive().get().traceCrossThread();
        try {
            traceCrossThread.setCarrier((key, value) -> {
                response.setHeader(key, value);
            });
            chain.doFilter(request, response);
        } finally {
            traceCrossThread.finish();
        }
    }
}

2、Skywalking链路追踪信息不完整

解决方案:需要在应用程序中添加Skywalking的全部插件进行深度监控,以保证链路追踪信息的完整性。

五、Skywalking链路追踪实战演练

在本节内容中,我们将演示如何通过Skywalking追踪Spring Cloud应用程序的调用链路,并使用Tag和Log记录关键点信息。

演示项目介绍

此次演示使用的是Spring Cloud官方提供的"Dalston.SR2"版本,该版本包含了Eureka、Feign等基本组件,以及两个微服务"service1"和"service2"。

演示步骤

1、下载并启动Skywalking Server

通过官网下载最新的Skywalking Server,并启动。


./bin/startup.sh

2、修改服务端配置(service1和service2)

修改bootstrap.yml文件,添加Skywalking Agent配置。


skywalking:
  agent:
    service_name: service1
    collector_address: localhost:11800
  trace:
    segment:
      enable: true

3、添加Skywalking Agent依赖

在服务1和服务2的pom.xml文件中,添加Skywalking Agent依赖,以及所需的Spring Cloud组件。


<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>8.0.0</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-feign</artifactId>
</dependency>

4、编写Service API

在服务1和服务2中,编写出一套简单的Service API。


@RequestMapping("/service1")
public interface Service1Api {
    @GetMapping("/call")
    String call();
}

@RequestMapping("/service2")
public interface Service2Api {
    @GetMapping("/call")
    String call();
}

5、编写Feign Client

在服务1中,编写出对服务2的Feign Client,实现调用Service2的逻辑。


@FeignClient(name = "service2")
public interface Service2Client {
    @GetMapping("/service2/call")
    String call();
} 

6、编写调用逻辑代码

在服务1中,编写出调用Service2的逻辑代码。


@RestController
public class Service1Controller implements Service1Api {
    @Autowired
    private Service2Client service2Client;
    @Autowired
    private Tracer tracer;
    @Override
    public String call() {
        Span span = tracer.buildSpan("Service1.call").start();
        try (Scope scope = tracer.scopeManager().activate(span, false)) {
            return service2Client.call();
        } finally {
            span.finish();
        }
    }
}

7、启动Eureka Server、Service1和Service2

分别启动Eureka Server、Service1和Service2。


java -jar eureka-server.jar
java -jar service1.jar
java -jar service2.jar

8、访问Service1并查看结果

访问"http://localhost:8081/service1/call",并在Skywalking控制台中查看调用链路和Tag、Log信息。

六、总结

通过本文的介绍,我们了解了Skywalking链路追踪的概念和原理,学会了如何在实践中使用Skywalking进行链路追踪,并掌握了如何通过Skywalking完善的插件和Tag/Log功能,来进行性能优化和问题排查。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
URHOBURHOB
上一篇 2025-01-24 18:46
下一篇 2025-01-24 18:47

相关推荐

  • 深度查询宴会的文化起源

    深度查询宴会,是指通过对一种文化或主题的深度挖掘和探究,为参与者提供一次全方位的、深度体验式的文化品尝和交流活动。本文将从多个方面探讨深度查询宴会的文化起源。 一、宴会文化的起源 …

    编程 2025-04-29
  • Python下载深度解析

    Python作为一种强大的编程语言,在各种应用场景中都得到了广泛的应用。Python的安装和下载是使用Python的第一步,对这个过程的深入了解和掌握能够为使用Python提供更加…

    编程 2025-04-28
  • Python递归深度用法介绍

    Python中的递归函数是一个函数调用自身的过程。在进行递归调用时,程序需要为每个函数调用开辟一定的内存空间,这就是递归深度的概念。本文将从多个方面对Python递归深度进行详细阐…

    编程 2025-04-27
  • Spring Boot本地类和Jar包类加载顺序深度剖析

    本文将从多个方面对Spring Boot本地类和Jar包类加载顺序做详细的阐述,并给出相应的代码示例。 一、类加载机制概述 在介绍Spring Boot本地类和Jar包类加载顺序之…

    编程 2025-04-27
  • 深度解析Unity InjectFix

    Unity InjectFix是一个非常强大的工具,可以用于在Unity中修复各种类型的程序中的问题。 一、安装和使用Unity InjectFix 您可以通过Unity Asse…

    编程 2025-04-27
  • 深度剖析:cmd pip不是内部或外部命令

    一、问题背景 使用Python开发时,我们经常需要使用pip安装第三方库来实现项目需求。然而,在执行pip install命令时,有时会遇到“pip不是内部或外部命令”的错误提示,…

    编程 2025-04-25
  • 动手学深度学习 PyTorch

    一、基本介绍 深度学习是对人工神经网络的发展与应用。在人工神经网络中,神经元通过接受输入来生成输出。深度学习通常使用很多层神经元来构建模型,这样可以处理更加复杂的问题。PyTorc…

    编程 2025-04-25
  • 深度解析Ant Design中Table组件的使用

    一、Antd表格兼容 Antd是一个基于React的UI框架,Table组件是其重要的组成部分之一。该组件可在各种浏览器和设备上进行良好的兼容。同时,它还提供了多个版本的Antd框…

    编程 2025-04-25
  • 深度解析MySQL查看当前时间的用法

    MySQL是目前最流行的关系型数据库管理系统之一,其提供了多种方法用于查看当前时间。在本篇文章中,我们将从多个方面来介绍MySQL查看当前时间的用法。 一、当前时间的获取方法 My…

    编程 2025-04-24
  • 深度学习鱼书的多个方面详解

    一、基础知识介绍 深度学习鱼书是一本系统性的介绍深度学习的图书,主要介绍深度学习的基础知识和数学原理,并且通过相关的应用案例来帮助读者理解深度学习的应用场景和方法。在了解深度学习之…

    编程 2025-04-24

发表回复

登录后才能评论