springboot?sleuth?日志跟蹤問題記錄
springboot sleuth 日志跟蹤
Spring Cloud Sleuth是一個在應(yīng)用中實現(xiàn)日志跟蹤的強有力的工具。使用Sleuth庫可以應(yīng)用于計劃任務(wù) 、多線程服務(wù)或復雜的Web請求,尤其是在一個由多個服務(wù)組成的系統(tǒng)中。當我們在這些應(yīng)用中來診斷問題時,即使有日志記錄也很難判斷出一個請求需要將哪些操作關(guān)聯(lián)在一起。
如果想要診斷復雜操作,通常的解決方案是在請求中傳遞唯一的ID到每個方法來識別日志。而Sleuth可以與日志框架Logback、SLF4J輕松地集成,通過添加獨特的標識符來使用日志跟蹤和診斷問題。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>SLF4J 配置 http://www.fzitv.net/article/71692.htm
在使用slf4j打印日志時會打印traceId,通過這ID可以把整個請求鏈給找出來.
如下是打印出來的實例
2019-06-19 17:16:21.453 [00c62017e97b7823,00c62017e97b7823] [http-nio-8777-exec-1]
需要把traceId給前端,使用aop,在每個返回結(jié)果中增加traceId字段
import brave.Tracer;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.google.gson.Gson;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;;import javax.servlet.http.HttpServletRequest;
@Aspect //定義一個切面
@Configuration
@Slf4j
public class TraceAspect {
// 定義切點Pointcut
@Pointcut("execution(* com.gf.controller..*.*(..))")
public void excudeService() {
}
@Autowired
Tracer tracer;
@Around("excudeService()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
log.info("請求開始, 各個參數(shù), url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);
// result的值就是被攔截方法的返回值
Object result = pjp.proceed();
JSONObject dd = JSONObject.parseObject(JSON.toJSONString(result));
dd.put("traceId",tracer.currentSpan().context().traceIdString());
log.info("請求結(jié)束,controller的返回值是 {} - {}", tracer.currentSpan().toString(), dd.toJSONString());
return dd;
}
}Spring Boot 中的分布式追蹤及使用
隨著互聯(lián)網(wǎng)應(yīng)用程序的復雜性不斷增加,分布式系統(tǒng)已經(jīng)成為了許多企業(yè)級應(yīng)用程序的標配。在分布式系統(tǒng)中,由于服務(wù)之間的調(diào)用關(guān)系錯綜復雜,很難追蹤到一個請求在整個系統(tǒng)中的執(zhí)行路徑和時間,這就給排查問題和性能優(yōu)化帶來了巨大的挑戰(zhàn)。為了解決這個問題,分布式追蹤技術(shù)應(yīng)運而生。本文將介紹 Spring Boot 中的分布式追蹤技術(shù)及其使用方法。
分布式追蹤的概念
分布式追蹤(Distributed Tracing)是一種用于追蹤分布式系統(tǒng)中請求的執(zhí)行路徑和時間的技術(shù)。在分布式系統(tǒng)中,由于請求可能會經(jīng)過多個服務(wù)節(jié)點,因此需要在請求流程中添加唯一的標識符(Trace ID),并將 Trace ID 傳遞給所有相關(guān)的服務(wù)節(jié)點。每個服務(wù)節(jié)點在處理請求時,都需要將 Trace ID 記錄在請求的上下文中,并將請求的上下文信息傳遞給下一個服務(wù)節(jié)點。這樣,就可以通過 Trace ID 來追蹤一個請求在整個系統(tǒng)中的執(zhí)行路徑和時間。在追蹤過程中,還需要記錄每個服務(wù)節(jié)點處理請求的時間和耗時,以便分析和優(yōu)化系統(tǒng)性能。
Spring Cloud Sleuth
Spring Cloud Sleuth 是 Spring Cloud 中的一個分布式追蹤框架,它提供了基于 Trace ID 的請求追蹤功能,可以協(xié)助開發(fā)人員快速追蹤分布式系統(tǒng)中的請求執(zhí)行路徑和時間,并幫助排查問題和優(yōu)化性能。
Spring Cloud Sleuth 使用 Zipkin 來存儲和展示分布式追蹤信息,Zipkin 是一個開源的分布式追蹤系統(tǒng),可以用于存儲和展示分布式系統(tǒng)中的請求追蹤信息。
Spring Boot 中的分布式追蹤
Spring Boot 集成了 Spring Cloud Sleuth,可以非常方便地實現(xiàn)分布式追蹤功能。在 Spring Boot 應(yīng)用程序中,只需要添加以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>添加這些依賴后,Spring Boot 應(yīng)用程序就可以自動配置分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
在應(yīng)用程序中,可以通過 Tracer 接口來創(chuàng)建 Trace ID,并將 Trace ID 記錄在請求的上下文中:
@Autowired
private Tracer tracer;
@GetMapping("/hello")
public String hello() {
Span span = tracer.nextSpan().name("hello").start();
try (Tracer.SpanInScope ws = tracer.withSpan(span)) {
// 處理請求
return "Hello World!";
} finally {
span.finish();
}
}在每個服務(wù)節(jié)點中,都需要將 Trace ID 記錄在請求的上下文中,并將請求的上下文信息傳遞給下一個服務(wù)節(jié)點。Spring Boot 可以通過 RestTemplate 和 Feign 來自動傳遞請求的上下文信息,只需要在 RestTemplate 和 Feign 中添加相應(yīng)的配置即可:
@Bean
public RestTemplate restTemplate() {
return new RestTemplateBuilder()
.interceptors(new TraceRestTemplateInterceptor(tracer()))
.build();
}
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder().requestInterceptor(new TraceFeignRequestInterceptor(tracer()));
}Zipkin 的使用
Zipkin 是一個用于存儲和展示分布式追蹤信息的系統(tǒng),可以用于分析和優(yōu)化分布式系統(tǒng)的性能。在 Spring Boot 中,可以通過以下步驟來使用 Zipkin:
1.下載并啟動 Zipkin 服務(wù)器
可以從 Zipkin 的官網(wǎng)下載 Zipkin 服務(wù)器,并啟動 Zipkin 服務(wù)器。啟動 Zipkin 服務(wù)器后,可以在瀏覽器中訪問 http://localhost:9411 來查看 Zipkin 的 Web 界面。
2.配置 Spring Boot 應(yīng)用程序發(fā)送追蹤信息到 Zipkin 服務(wù)器
在 Spring Boot 應(yīng)用程序中,可以通過以下配置來將追蹤信息發(fā)送到 Zipkin 服務(wù)器:
spring:
zipkin:
base-url: http://localhost:94113.查看分布式追蹤信息
在啟動 Spring Boot 應(yīng)用程序后,可以通過訪問應(yīng)用程序的端點來觸發(fā)請求,并在 Zipkin 的 Web 界面中查看分布式追蹤信息。在 Zipkin 的 Web 界面中,可以查看每個請求的 Trace ID、請求流程中的服務(wù)節(jié)點、服務(wù)節(jié)點的執(zhí)行時間和耗時等信息。
總結(jié)
分布式追蹤技術(shù)是解決分布式系統(tǒng)中請求執(zhí)行路徑和時間無法追蹤的問題的關(guān)鍵技術(shù)之一。
Spring Boot 集成了 Spring Cloud Sleuth 和 Zipkin,使得分布式追蹤變得非常簡單。
在 Spring Boot 應(yīng)用程序中,可以通過添加相應(yīng)的依賴和配置來實現(xiàn)分布式追蹤功能,并將追蹤信息發(fā)送到 Zipkin 服務(wù)器。
使用分布式追蹤技術(shù)可以幫助開發(fā)人員更好地管理和監(jiān)控分布式系統(tǒng),并提高系統(tǒng)的可靠性和性能。
到此這篇關(guān)于Spring Boot 中的 Sleuth 簡介及使用方法的文章就介紹到這了,更多相關(guān)Spring Boot Sleuth使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis中如何實現(xiàn)一個標簽執(zhí)行多個sql語句
這篇文章主要介紹了mybatis中如何實現(xiàn)一個標簽執(zhí)行多個sql語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
關(guān)于Spring?Cloud實現(xiàn)日志管理模塊
這篇文章主要介紹了關(guān)于Spring?Cloud實現(xiàn)日志管理模塊問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11
springboot+springmvc實現(xiàn)登錄攔截
這篇文章主要介紹了springboot+springmvc實現(xiàn)登錄攔截,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10
完美解決springboot項目出現(xiàn)”java: 錯誤: 無效的源發(fā)行版:17“問題(圖文詳解)
這篇文章主要介紹了完美解決springboot項目出現(xiàn)”java: 錯誤: 無效的源發(fā)行版:17“問題,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下2023-04-04

