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/zh-tw/n/332605.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
URHOB的頭像URHOB
上一篇 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

發表回復

登錄後才能評論