最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud Sleuth 分布式鏈路追蹤實(shí)踐指南

 更新時(shí)間:2025年11月03日 16:27:53   作者:FearlessVoyager  
SpringCloud Sleuth是一個(gè)用于分布式追蹤的組件,通過為每個(gè)請(qǐng)求生成唯一的TraceID和SpanID,記錄請(qǐng)求在多個(gè)微服務(wù)中的流轉(zhuǎn)情況,本文重點(diǎn)給大家介紹SpringCloud Sleuth 分布式鏈路追蹤的實(shí)例講解,感興趣的朋友跟隨小編一起看看吧

一、Sleuth 概述

Sleuth 是 Spring Cloud 生態(tài)系統(tǒng)中的一個(gè)組件,它提供了分布式追蹤的解決方案。在微服務(wù)架構(gòu)中,一個(gè)請(qǐng)求可能會(huì)經(jīng)過多個(gè)服務(wù),Spring Cloud Sleuth 可以幫助我們跟蹤這些請(qǐng)求,為每個(gè)請(qǐng)求生成一個(gè)唯一的追蹤ID,并在日志中記錄這些ID,從而使得我們可以輕松地追蹤請(qǐng)求在各個(gè)微服務(wù)中的流轉(zhuǎn)情況。

二、Sleuth 核心概念

  1. Trace:一次完整的分布式請(qǐng)求跟蹤,相當(dāng)于一個(gè)樹狀結(jié)構(gòu),從請(qǐng)求到第一個(gè)服務(wù)開始,到最后一個(gè)服務(wù)返回響應(yīng)結(jié)束。每個(gè) Trace 有一個(gè)唯一的 Trace ID。
  2. Span:表示一個(gè)基本的工作單元,比如一次 HTTP 請(qǐng)求、一次數(shù)據(jù)庫(kù)調(diào)用等。每個(gè) Span 有一個(gè)唯一的 Span ID。一個(gè) Trace 由多個(gè) Span 組成,這些 Span 之間具有父子關(guān)系。
  3. Annotation:用于記錄事件的時(shí)間點(diǎn),例如:
    • cs(Client Sent):客戶端發(fā)送請(qǐng)求,表示開始一個(gè) Span。
    • sr(Server Received):服務(wù)端接收請(qǐng)求,并開始處理。
    • ss(Server Sent):服務(wù)端發(fā)送響應(yīng),表示處理完成。
    • cr(Client Received):客戶端接收響應(yīng),表示 Span 結(jié)束。

三、Sleuth 核心功能

  1. 分布式追蹤:跟蹤請(qǐng)求在微服務(wù)間的流轉(zhuǎn)路徑。
  2. Span 管理:記錄每個(gè)服務(wù)處理單元的工作單元。
  3. Trace 上下文傳播:在服務(wù)間傳遞追蹤上下文。
  4. 與 Zipkin 集成:將追蹤數(shù)據(jù)導(dǎo)出到 Zipkin 進(jìn)行可視化分析。

四、Sleuth 實(shí)現(xiàn)原理

Spring Cloud Sleuth 的實(shí)現(xiàn)原理可以總結(jié)為:

  1. 標(biāo)識(shí)與上下文: 通過 TraceId 和 SpanId 唯一標(biāo)識(shí)請(qǐng)求鏈路和單元。
  2. 傳播與透?jìng)鳎?利用 ThreadLocal 進(jìn)行進(jìn)程內(nèi)上下文存儲(chǔ),并通過 HTTP 頭等載體進(jìn)行跨服務(wù)上下文傳播。
  3. 自動(dòng)化與透明: 通過自動(dòng)儀器化主流框架組件,對(duì)開發(fā)者透明地完成追蹤邏輯的植入。
  4. 收集與可視化: 通過 Reporter 將完成的 Span 數(shù)據(jù)上報(bào)給 Zipkin 等后端,進(jìn)行聚合、存儲(chǔ)和圖形化展示。
  5. 日志增強(qiáng): 通過與 MDC 集成,無(wú)縫地將追蹤信息輸出到應(yīng)用日志中,極大方便了問題排查。

五、實(shí)現(xiàn)案例(Sleuth + Zipkin)

使用Spring Boot和Spring Cloud Sleuth與Zipkin來(lái)實(shí)現(xiàn)分布式鏈路追蹤,主要步驟:

  1. 創(chuàng)建兩個(gè)Spring Boot服務(wù):一個(gè)作為服務(wù)提供者(provider),一個(gè)作為服務(wù)消費(fèi)者(consumer),消費(fèi)者調(diào)用提供者的服務(wù)。
  2. 引入Spring Cloud Sleuth和Zipkin的依賴。
  3. 配置Zipkin服務(wù)器地址。
  4. 通過RestTemplate或FeignClient進(jìn)行服務(wù)調(diào)用,Sleuth會(huì)自動(dòng)追蹤。
  5. 啟動(dòng)Zipkin服務(wù)器來(lái)收集和展示追蹤數(shù)據(jù)。

5.1 環(huán)境準(zhǔn)備

使用 Docker 啟動(dòng) Zipkin Server。

# 使用 Docker 運(yùn)行 Zipkin
docker run -d -p 9411:9411 --name zipkin openzipkin/zipkin
# 或者使用命令行啟動(dòng)(需要 Java 環(huán)境)
# curl -sSL https://zipkin.io/quickstart.sh | bash -s
# java -jar zipkin.jar

5.2 添加依賴

在服務(wù)提供者和服務(wù)消費(fèi)者服務(wù)的pom.xml文件中分別添加Sleuth和Zipkin的依賴。

<!-- Spring Cloud 版本管理 -->
<properties>
    <spring-cloud.version>2022.0.4</spring-cloud.version>
</properties>
<!-- Sleuth + Zipkin 依賴 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>

5.3 配置文件

在服務(wù)提供者和服務(wù)消費(fèi)者服務(wù)的application.yml配置文件中配置Zipkin服務(wù)器地址。

spring:
  application:
    name: user-service
  sleuth:
    sampler:
      probability: 1.0  # 采樣率,1.0表示100%采樣
  zipkin:
    base-url: http://localhost:9411  # Zipkin服務(wù)器地址
    sender:
      type: web

5.4 服務(wù)間調(diào)用追蹤

當(dāng)服務(wù)都啟動(dòng)成功后,進(jìn)行服務(wù)間的調(diào)用時(shí),Sleuth會(huì)自動(dòng)在header中添加Trace信息。

@RestController
@RequestMapping("/users")
public class UserController {
    private final RestTemplate restTemplate;
    private final UserService userService;
    public UserController(RestTemplate restTemplate, UserService userService) {
        this.restTemplate = restTemplate;
        this.userService = userService;
    }
    @GetMapping("/{userId}/orders")
    public UserOrderInfo getUserOrders(@PathVariable Long userId) {
        // Sleuth會(huì)自動(dòng)在header中添加Trace信息
        ResponseEntity<OrderList> orderResponse = restTemplate.exchange(
            "http://order-service/orders/user/" + userId,
            HttpMethod.GET,
            null,
            OrderList.class
        );
        User user = userService.getUserById(userId);
        return new UserOrderInfo(user, orderResponse.getBody());
    }
}

5.5 查看 Zipkin 鏈路追蹤

訪問 http://localhost:9411 查看鏈路追蹤數(shù)據(jù):

  1. 在 Zipkin UI 中可以看到服務(wù)間的調(diào)用關(guān)系。
  2. 查看每個(gè)請(qǐng)求的詳細(xì)鏈路信息。
  3. 分析服務(wù)調(diào)用的耗時(shí)和依賴關(guān)系。

六、高級(jí)配置和自定義

6.1 自定義 Span 標(biāo)簽

@Service
public class UserService {
    private final Tracer tracer;
    public UserService(Tracer tracer) {
        this.tracer = tracer;
    }
    public User getUserById(Long userId) {
        // 創(chuàng)建自定義Span
        Span userSpan = tracer.nextSpan().name("db.user.query").start();
        try (Tracer.SpanInScope ws = tracer.withSpanInScope(userSpan)) {
            // 業(yè)務(wù)邏輯
            userSpan.tag("user.id", userId.toString());
            userSpan.event("query.user.from.database");
            // 模擬數(shù)據(jù)庫(kù)查詢
            return userRepository.findById(userId);
        } catch (Exception e) {
            userSpan.error(e);
            throw e;
        } finally {
            userSpan.end();
        }
    }
}

6.2 異步方法追蹤

@Async
@Sleuth
public CompletableFuture<User> getUserAsync(Long userId) {
    // Sleuth會(huì)自動(dòng)傳遞Trace上下文
    return CompletableFuture.supplyAsync(() -> userRepository.findById(userId));
}

6.3 自定義采樣策略

@Configuration
public class TraceConfig {
    @Bean
    public Sampler defaultSampler() {
        // 自定義采樣策略:只追蹤重要接口
        return new Sampler() {
            @Override
            public boolean isSampled(TraceContext traceContext) {
                // 根據(jù)請(qǐng)求路徑?jīng)Q定是否采樣
                String path = getCurrentRequestPath();
                return path.startsWith("/api/") || path.startsWith("/internal/");
            }
        };
    }
}

6.4 數(shù)據(jù)庫(kù)調(diào)用追蹤

@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        // 使用P6Spy攔截SQL語(yǔ)句
        P6SpyDataSource dataSource = new P6SpyDataSource(actualDataSource());
        return dataSource;
    }
}

6.5 消息隊(duì)列追蹤

@Component
public class MessageService {
    private final Tracer tracer;
    private final StreamBridge streamBridge;
    public void sendUserCreatedEvent(User user) {
        // 手動(dòng)注入Trace信息到消息頭
        Message<User> message = MessageBuilder.withPayload(user)
            .setHeader("traceId", tracer.currentSpan().context().traceId())
            .setHeader("spanId", tracer.currentSpan().context().spanId())
            .build();
        streamBridge.send("user-created-out-0", message);
    }
}

到此這篇關(guān)于SpringCloud Sleuth 分布式鏈路追蹤的文章就介紹到這了,更多相關(guān)SpringCloud Sleuth鏈路追蹤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java9開始——接口中可以定義private私有方法

    java9開始——接口中可以定義private私有方法

    這篇文章主要介紹了從java9開始 接口中可以定義private私有方法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-10-10
  • java 反射機(jī)制詳解及實(shí)例代碼

    java 反射機(jī)制詳解及實(shí)例代碼

    這篇文章主要介紹了java 反射機(jī)制詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • idea中使用git插件回滾代碼的流程步驟

    idea中使用git插件回滾代碼的流程步驟

    使用idea開發(fā)java代碼時(shí),如果想回滾git提交的代碼, 需要操作三步,本篇步驟操作前,前提是你的電腦已經(jīng)安裝了git插件,并且你的idea也集成了git插件,下面是詳細(xì)步驟,需要的朋友可以參考下
    2025-04-04
  • Spring?Security+JWT如何實(shí)現(xiàn)前后端分離權(quán)限控制

    Spring?Security+JWT如何實(shí)現(xiàn)前后端分離權(quán)限控制

    本篇將手把手教你用?Spring?Security?+?JWT?搭建一套完整的登錄認(rèn)證與權(quán)限控制體系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • HashMap的底層實(shí)現(xiàn)原理分析

    HashMap的底層實(shí)現(xiàn)原理分析

    本文主要介紹了HashMap的底層實(shí)現(xiàn)結(jié)構(gòu),包括JDK1.7和1.8版本的區(qū)別,JDK1.7使用數(shù)組加鏈表實(shí)現(xiàn),而JDK1.8引入了紅黑樹優(yōu)化,文章詳細(xì)解釋了HashMap如何確定哈希桶數(shù)組索引位置、put方法的執(zhí)行過程以及擴(kuò)容原理
    2025-01-01
  • 詳解Java中int和Integer的區(qū)別

    詳解Java中int和Integer的區(qū)別

    這篇文章主要介紹了Java中int和Integer的區(qū)別文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Spring?Boot?4.0對(duì)于Java開發(fā)的影響和前景

    Spring?Boot?4.0對(duì)于Java開發(fā)的影響和前景

    探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來(lái)可能性!別錯(cuò)過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?
    2024-02-02
  • 淺談Spring框架中@Autowired和@Resource的區(qū)別

    淺談Spring框架中@Autowired和@Resource的區(qū)別

    最近review別人代碼的時(shí)候,看到了一些@Autowired不一樣的用法,覺得有些意思,下面這篇文章主要給大家介紹了關(guān)于Spring框架中@Autowired和@Resource區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Java線程通訊的實(shí)現(xiàn)方法總結(jié)

    Java線程通訊的實(shí)現(xiàn)方法總結(jié)

    線程通訊指的是多個(gè)線程之間通過共享內(nèi)存或消息傳遞等方式來(lái)協(xié)調(diào)和同步它們的執(zhí)行,線程通訊的實(shí)現(xiàn)方式主要有以下兩種:共享內(nèi)存和消息傳遞,本文詳細(xì)介紹了Java線程是如何通訊的,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • Java進(jìn)階知識(shí)之反射的概念與獲取方法

    Java進(jìn)階知識(shí)之反射的概念與獲取方法

    這篇文章主要給大家介紹了關(guān)于Java進(jìn)階知識(shí)之反射的概念與獲取方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論

仙桃市| 汶上县| 彭水| 绍兴市| 铁岭市| 常熟市| 靖江市| 洛川县| 沂南县| 霍邱县| 锦屏县| 南昌县| 大荔县| 三都| 淮安市| 皮山县| 漳浦县| 都江堰市| 腾冲县| 承德县| 呼和浩特市| 民勤县| 金昌市| 荔波县| 三门峡市| 高清| 迁安市| 红桥区| 广汉市| 弋阳县| 九江县| 壶关县| 石嘴山市| 金溪县| 定远县| 观塘区| 商水县| 华池县| 达拉特旗| 道孚县| 宝清县|