Welcome to YARP - 8.分布式跟踪
Welcome to YARP - 1.認識YARP并搭建反向代理服務
Welcome to YARP - 2.配置功能
- 2.1 - 配置文件(Configuration Files)
- 2.2 - 配置提供者(Configuration Providers)
- 2.3 - 配置過濾器(Configuration Filters)
Welcome to YARP - 3.負載均衡
Welcome to YARP - 4.限流
Welcome to YARP - 5.身份驗證和授權
Welcome to YARP - 6.壓縮、緩存
Welcome to YARP - 7.目標健康檢查
Welcome to YARP - 8.分布式跟蹤
這篇文章結束,YARP 的學習就先告一段落了。還有很多省略的章節(比如:中間件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官網的文檔了解。
介紹
在介紹 YARP 的分布式跟蹤之前,我們先來了解一下什么是分布式跟蹤。
當我們構建大型的應用程序或系統時,通常會將其拆分成多個部分,這些部分可能運行在不同的計算機或進程中。這種分布式架構有助于提高系統的可伸縮性和性能,但也增加了故障診斷的難度。分布式跟蹤就像是應用程序的偵探工具,可以幫助工程師找出應用程序中的問題,特別是那些可能橫跨多個計算機或進程的問題。
舉個例子,假設我們有一個典型的網頁服務,用戶發送請求后,這個請求可能經過負載均衡器,然后傳遞給后端的Web服務器進程,最后可能會涉及數據庫的多次查詢。使用分布式跟蹤,就像我們在調查一樁案件一樣,工程師可以追蹤整個請求的過程。他們能夠分辨每個步驟是否成功,每個步驟花費了多少時間,甚至可以記錄每個步驟產生的詳細信息。
作為 ASP.NET Core 的組件,YARP 可以像任何其他 Web 應用程序一樣輕松集成到不同的跟蹤系統中。可以使用以下程序配置分布式跟蹤,詳情參考:
- OpenTelemetry ( 是一個與供應商無關的庫,支持多種服務 )
- Application Insights Application Insights ( 是由 Microsoft 提供的功能齊全的服務 )
.NET 具有對分布式跟蹤的內置可配置支持,YARP 利用這些支持來啟用此類現成方案。
使用自定義跟蹤標頭
在使用 .NET 不原生支持的傳播機制時,需要創建一個專門的傳播器(DistributedContextPropagator)來處理該機制的上下文信息傳遞。
YARP 會移除 DistributedContextPropagator.Fields( 這是DistributedContextPropagator中的一個屬性或字段,用于存儲與上下文傳播相關的信息 ) 中的任何標頭,以便在 Inject 調用期間,傳播器可以重新添加它們到請求中。 這個步驟是為了在整個傳播過程中有效地管理標頭信息,以確保它們被適當地處理和傳遞。
透傳代理
如果不希望代理主動參與跟蹤,并希望保留所有跟蹤標頭,您可以通過將SocketsHttpHandler.ActivityHeadersPropagator 設置為null來實現。這表示代理將保持對跟蹤標頭的透明傳遞,而不會主動干預。
services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);
示例
1.創建項目
dotnet new web -n YARP.Metrics -f net6.0
2.添加項目引用
<ItemGroup>
<PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>
這個是 YARP 提供的庫,用來監聽代理操作的各個階段,從而收集有關請求處理的詳細信息和性能指標。
在內部,
YARP使用EventSource來收集來自許多用于處理請求的子系統的遙測事件和指標。要監聽這些指標,需要在 DI(依賴注入)中注冊實現每個功能接口的類。以下是該類庫提供的功能:
功能概述:
- Proxy(代理):代表整個代理操作,包括成功或失敗。
- 事件包括:
- 代理請求的啟動和停止時
- 請求/響應主體處理時
- 指標包括:
- 啟動的請求數量
- 進行中的請求數量
- 失敗的請求數量
- Kestrel:處理傳入請求的 Web 服務器。
- 事件包括:
- 請求的啟動/停止或失敗時
- 指標包括:
- 連接速率 - 每秒打開的連接數
- 總連接數
- TLS 握手次數
- 入站隊列長度
- Http:用于向目標服務器發出出站請求的 HttpClient。
- 事件包括:
- 連接創建時
- 請求的啟動/停止或失敗時
- 標頭/內容發送/接收時
- 請求在連接可用時出隊列時
- 指標包括:
- 啟動的出站請求數量
- 失敗的請求數量
- 活動請求數量
- 出站連接數量
- Sockets:涉及連接嘗試的事件和有關發送和接收的數據量的指標。
- NameResolution:涉及名稱解析嘗試的事件和有關目標的 DNS 查詢的指標。
- NetSecurity:涉及 SslStream 握手的事件和有關每個協議的握手數量和延遲的指標。
3.關鍵文件
- ForwarderTelemetryConsumer(監聽來自代理遙測的事件,記錄與代理請求處理的高級別過程相關的時序和信息。)
- HttpClientTelemetryConsumer(監聽來自 HttpClient 遙測的事件,記錄與目標服務器的出站請求和響應相關的時序和信息。)
- PerRequestMetrics(存儲按每個請求計算的指標的類。實例在請求的整個生命周期內存儲在 AsyncLocal 存儲中。)
- PerRequestYarpMetricCollectionMiddleware(處理請求的第一步和最后一步。它初始化每個請求的指標,并在請求結束時記錄結果。)
4.在DI中注冊
using YARP.Metrics;
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
services.AddControllers();
services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
services.AddHttpContextAccessor();
// 用于收集有關代理轉發的常規指標的接口
services.AddMetricsConsumer<ForwarderMetricsConsumer>();
// 將使用者注冊到代理轉發器遙測的事件
services.AddTelemetryConsumer<ForwarderTelemetryConsumer>();
// 將使用者注冊到HttpClient遙測事件
services.AddTelemetryConsumer<HttpClientTelemetryConsumer>();
services.AddTelemetryConsumer<WebSocketsTelemetryConsumer>();
var app = builder.Build();
// 收集和報告代理度量的自定義中間件
// 放置在開頭,因此它是每個請求運行的第一件也是最后一件事
app.UsePerRequestMetricCollection();
// 用于攔截WebSocket連接并收集暴露給WebSocketsTemetryConsumer的遙測的中間件
app.UseWebSocketsTelemetry();
app.MapReverseProxy();
app.Run();
5.Appsettings.json配置
{
"Logging": {
"LogLevel": {
"Default": "Information",
// "Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1": {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
"Address": "https://www.baidu.com/"
}
}
}
}
}
}
5.運行項目
接下來我們運行項目,就可以看到代理請求的一些指標數據:
總結
到這里分布式跟蹤篇章也已經結束了,它在分布式系統中尤為重要,可以分析性能瓶頸,定位錯誤和異常。而且收集的這些遙測數據(指標)可以導出到多種不同的后端存儲或可視化工具中。比如:Zipkin、Jaeger、Prometheus,這都是后話了。有興趣的小伙伴自己研究吧。相關代碼已上傳Github,關鍵文件也都有注釋。至此 YARP 的學習就先告一段落了。還有很多省略的章節(比如:中間件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官網的文檔了解。
總結
以上是生活随笔為你收集整理的Welcome to YARP - 8.分布式跟踪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软加入 Blender 基金会
- 下一篇: 以金开头的成语有哪些啊?