《勇敢者》簡介
一、簡介
在微服務架構非常流行的現代軟體開發中,追蹤和分析跨各種服務的請求流的能力至關重要。因此,分散式追蹤成為一種重要工具,可以深入了解我們系統的效能和行為。
在本教程中,我們將介紹Brave ,它是 Java 生態系統中流行的分散式追蹤工具庫。
2. 理解分散式追蹤
分散式追蹤**是一種用於監視和排除由互連服務組成的複雜分散式系統的方法。**在此類系統中,請求可能會遍歷多個服務,每個服務負責執行特定任務。因此,如果不使用一些專用工具,追蹤請求的過程可能會變得具有挑戰性。
在探索分散式追蹤之前,我們必須定義兩個關鍵概念: traces
和spans
。追蹤表示外部請求並由一組跨度組成。一個span代表一個操作;其關鍵屬性是操作名稱、開始時間和結束時間。一個跨度可以有一個或多個代表嵌套操作的子跨度。
現在,讓我們探討分散式追蹤的關鍵元件:偵測程式庫和分散式追蹤伺服器。每個服務使用的檢測庫的主要目的是產生和傳播追蹤資料。這涉及捕獲服務內的操作細節,例如處理傳入請求、對其他服務或資料庫進行出站呼叫以及處理資料。
另一方面,分散式追蹤伺服器代表追蹤資料管理的中央樞紐。它提供用於從儀器庫接收追蹤資料、聚合和儲存資料的 API,並提供用於分析、監控和故障排除的工具。
下圖顯示了分散式追蹤的工作原理以及元件之間的交互作用:
3.拉鍊
Zipkin是一個領先的開源分散式追蹤系統,最初由 Twitter 開發。它旨在幫助收集解決微服務架構中的延遲問題所需的資料。它從儀表化服務收集數據,然後提供該數據的詳細視圖。
Zipkin 包含四個主要組件,我們將在以下小節中詳細介紹每個組件。
3.1.集電極
當檢測服務產生追蹤資料時,需要收集和處理。因此,收集器負責接收和驗證 Zipkin 接收到的痕跡。一旦痕跡經過驗證,它們就會被儲存以供以後檢索和分析。收集器可以透過HTTP或AMQP接收數據,使其靈活且適合各種系統架構。
3.2.貯存
Zipkin 最初是為了使用 Cassandra 儲存資料而建立的,因為它具有高度可擴展性、靈活性,並且在 Twitter 中廣泛使用。然而,Zipkin 已更新為更具可配置性,支援其他儲存選項,例如 ElasticSearch、MySQL,甚至是記憶體儲存。
3.3.應用程式介面
資料儲存後,Zipkin 會透過 RESTful 介面提供直覺的資料擷取方法。該介面使我們能夠根據需要輕鬆定位和檢索痕跡。此外,該 API 還充當 Zipkin Web UI 的支柱,而 Zipkin Web UI 是其主要資料來源。
3.4.網頁使用者介面
Zipkin 提供的圖形使用者介面 (GUI) 代表了一種可視化的可存取方法,用於根據服務、時間和註釋檢查追蹤。此外,它透過允許我們深入研究特定的追蹤來促進詳細的分析,這使得它對於解決涉及分散式事務的複雜問題特別有價值。
4. 勇敢
Brave 是一個分散式追蹤儀器庫。它攔截生產請求、收集計時資料並傳播追蹤上下文。其主要目標是促進分散式系統內計時資料的關聯,從而能夠有效地解決延遲問題。
儘管 Brave 通常將追蹤資料傳送到 Zipkin 伺服器,但它透過第三方外掛程式提供了與Amazon X-Ray等其他服務整合的靈活性。
Brave 提供與 JRE6 及更高版本相容的無依賴追蹤器庫。它提供了一個重要的 API,用於計時操作並用描述性屬性標記它們。該函式庫還包含解析X-B3-TraceId
標頭的程式碼,進一步豐富了其功能。
雖然直接追蹤程式碼實作通常是不必要的,但使用者可以利用 Brave 和 Zipkin 提供的現有工具。值得注意的是,用於常見追蹤場景(如 JDBC、Servlet 和 Spring)的庫隨時可用,經過精心測試和基準測試。
對於處理遺留應用程式的人來說, Spring XML 配置提供了無縫的追蹤設置,無需自訂程式碼。
用戶還可能尋求將追蹤 ID 整合到日誌檔案中或修改線程本地行為。在這種情況下,Brave 提供的上下文庫可以與 SLF4J 等工具無縫整合。
5. 如何使用勇敢
接下來,讓我們建立一個簡單的 Java 和 Spring Boot 應用程序,並將其與 Brave 和 Zipkin 整合。
5.1. 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。
5.2.項目設定
我們將從一個帶有[brave](https://mvnrepository.com/artifact/io.zipkin.brave/brave) , [zipkin-reporter](https://mvnrepository.com/artifact/io.zipkin.reporter2/zipkin-reporter) , [zipkin-sender-okhttp3](http://zipkin-sender-okhttp3) ,
和[zipkin-reporter-brave](https://mvnrepository.com/artifact/io.zipkin.reporter2/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("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("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](https://github.com/openzipkin/brave-example)
儲存庫還描述了追蹤簡單 Web 應用程式的替代方法。
5. 結論
正如我們在整篇文章中所了解到的,Brave 幫助我們有效地監控我們的應用程式。 Brave 簡化了檢測流程,並透過與 Zipkin 的無縫整合證明了分散式系統中的寶貴資產。
與往常一樣,原始碼可以在 GitHub 上取得。