一、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