微服務分散式跟蹤工具Brave簡介

banq發表於2024-04-14

在微服務架構非常流行的現代軟體開發中,跟蹤和分析跨各種服務的請求流的能力至關重要。因此,分散式跟蹤成為一種重要工具,可以深入瞭解我們系統的效能和行為。

在本教程中,我們將介紹Brave,它是 Java 生態系統中流行的分散式跟蹤工具庫。

什麼是分散式追蹤
分散式跟蹤是一種用於監視和排除由互連服務組成的複雜分散式系統的方法。在此類系統中,請求可能會遍歷多個服務,每個服務負責執行特定任務。因此,如果不使用一些專用工具,跟蹤請求的過程可能會變得具有挑戰性。

在探索分散式跟蹤之前,我們必須定義兩個關鍵概念:跟蹤和跨度。跟蹤表示外部請求並由一組跨度組成。一個span代表一個操作;其關鍵屬性是操作名稱、開始時間和結束時間。一個跨度可以有一個或多個表示巢狀操作的子跨度。

現在,讓我們探討分散式跟蹤的關鍵元件:檢測庫和分散式跟蹤伺服器。每個服務使用的檢測庫的主要目的是生成和傳播跟蹤資料。這涉及捕獲服務內的操作細節,例如處理傳入請求、對其他服務或資料庫進行出站呼叫以及處理資料。

另一方面,分散式跟蹤伺服器代表跟蹤資料管理的中央樞紐。它提供用於從儀器庫接收跟蹤資料、聚合和儲存資料的 API,並提供用於分析、監控和故障排除的工具。


Zipkin是什麼?
Zipkin是一個領先的開源分散式追蹤系統,最初由 Twitter 開發。它旨在幫助收集解決微服務架構中的延遲問題所需的資料。它從儀表化服務收集資料,然後提供該資料的詳細檢視。

Zipkin 包含四個主要元件,我們將在以下小節中詳細介紹每個元件。

收集器Collector
當檢測服務生成跟蹤資料時,需要收集和處理。因此,收集器負責接收和驗證 Zipkin 接收到的痕跡。一旦痕跡經過驗證,它們就會被儲存以供以後檢索和分析。收集器可以透過HTTP或AMQP接收資料,使其靈活且適合各種系統架構。

貯存器
Zipkin 最初是為了使用Cassandra儲存資料而構建的 ,因為它具有高度可擴充套件性、靈活性,並且在 Twitter 中得到廣泛使用。然而,Zipkin 已更新為更具可配置性,支援其他儲存選項,例如ElasticSearch、MySQL,甚至記憶體儲存。

API
資料儲存後,Zipkin 會透過 RESTful 介面提供直觀的資料提取方法。該介面使我們能夠根據需要輕鬆定位和檢索痕跡。此外,該 API 還充當 Zipkin Web UI 的支柱,而 Zipkin Web UI 是其主要資料來源。

網頁使用者介面
Zipkin 提供的圖形使用者介面 (GUI) 代表了一種視覺化可訪問的方法,用於根據服務、時間和註釋檢查跟蹤。此外,它透過允許我們深入研究特定的跟蹤來促進詳細的分析,這使得它對於解決涉及分散式事務的複雜問題特別有價值。

什麼是Brave
Brave 是一個分散式跟蹤儀器庫。它攔截生產請求、收集計時資料並傳播跟蹤上下文。其主要目標是促進分散式系統內計時資料的關聯,從而能夠有效地解決延遲問題。

儘管 Brave 通常將跟蹤資料傳送到 Zipkin 伺服器,但它透過第三方外掛提供了與Amazon X-Ray等其他服務整合的靈活性。

Brave 提供與 JRE6 及更高版本相容的無依賴跟蹤器庫。它提供了一個重要的 API,用於計時操作並用描述性屬性標記它們。該庫還包含解析X-B3-TraceId標頭的程式碼  ,進一步豐富了其功能。

雖然直接跟蹤程式碼實現通常是不必要的,但使用者可以利用Brave 和 Zipkin 提供的現有工具。值得注意的是,用於常見跟蹤場景(如 JDBC、Servlet 和 Spring)的庫隨時可用,經過精心測試和基準測試。

對於那些處理遺留應用程式的人來說,Spring XML 配置提供了無縫的跟蹤設定,無需自定義程式碼。

使用者還可能尋求將跟蹤 ID 整合到日誌檔案中或修改執行緒本地行為。在這種情況下,Brave 提供的上下文庫可以與 SLF4J 等工具無縫整合。

如何使用
接下來,讓我們構建一個簡單的 Java 和 Spring Boot 應用程式,並將其與 Brave 和 Zipkin 整合。

Zipkin 超薄設定
首先,我們需要執行一個 Zipkin 伺服器。為此,我們將使用 Zipkin Slim,這是 Zipkin 的精簡版,它更小,啟動速度更快。它支援記憶體和 Elasticsearch 儲存,但不支援透過 Kafka 或 RabbitMQ 進行訊息傳遞。

Zipkin 的官方儲存庫中記錄了多種使用方法。此外,執行 Zipkin 伺服器的更多方法可以在我們關於使用 Zipkin 進行跟蹤服務的文章中找到。

為簡單起見,我們假設本地計算機上已經安裝了Docker,並使用以下命令執行它:

docker run -d -p 9411:9411 openzipkin/zipkin-slim

現在,透過訪問http://localhost:9411/zipkin/,我們可以視覺化 Zipkin Web UI。

專案設定
我們將從一個帶有brave、zipkin-reporter、zipkin-sender-okhttp3和zipkin-reporter-brave依賴項的空Spring Boot專案開始:

<dependency>
    <groupId>io.zipkin.brave</groupId>
    <artifactId>brave</artifactId>
    <version>6.0.2</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-sender-okhttp3</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
    <version>3.3.0</version>
</dependency>

繼續,我們需要一個配置類來例項化Tracer bean 以便稍後使用它:

@Configuration
public class TracingConfiguration {
    @Bean
    BytesMessageSender sender() {
        return OkHttpSender.create(<font>"http://127.0.0.1:9411/api/v2/spans");
    }
    @Bean
    AsyncZipkinSpanHandler zipkinSpanHandler(BytesMessageSender sender) {
        return AsyncZipkinSpanHandler.create(sender);
    }
    @Bean
    public Tracing tracing(AsyncZipkinSpanHandler zipkinSpanHandler) {
        return Tracing.newBuilder()
          .localServiceName(
"Dummy Service")
          .addSpanHandler(zipkinSpanHandler)
          .build();
    }
    @Bean
    public Tracer tracer(Tracing tracing) {
        return tracing.tracer();
    }
}

現在,我們可以將 Tracer 直接注入到我們的 bean 中。為了進行演示,我們將建立一個虛擬服務,該服務在初始化後將向 Zipkin 傳送跟蹤:

@Service
public class TracingService {
    private final Tracer tracer;
    public TracingService(Tracer tracer) {
        this.tracer = tracer;
    }
    @PostConstruct
    private void postConstruct() {
        Span span = tracer.nextSpan().name(<font>"Hello from Service").start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } finally {
            span.finish();
        }
    }
}

如果我們執行我們的應用程式並檢查 Zipkin Web UI,我們應該能夠看到我們的跟蹤,僅包含一個跨度,大約需要 2 秒:


請注意,此示例僅簡單配置了跟蹤。當處理更復雜的場景時,建議使用Spring Cloud Sleuth。

此外,brave-example儲存庫還描述了跟蹤簡單 Web 應用程式的替代方法。

結論
正如我們在整篇文章中瞭解到的,Brave 幫助我們有效地監控我們的應用程式。 Brave 簡化了檢測流程,並透過與 Zipkin 的無縫整合證明了分散式系統中的寶貴資產。

相關文章