Welcome to YARP - 8.分布式跟踪
Welcome to YARP - 1.認識YARP并搭建反向代理服務(wù)
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.身份驗證和授權(quán)
Welcome to YARP - 6.壓縮、緩存
Welcome to YARP - 7.目標健康檢查
Welcome to YARP - 8.分布式跟蹤
這篇文章結(jié)束,YARP 的學(xué)習(xí)就先告一段落了。還有很多省略的章節(jié)(比如:中間件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官網(wǎng)的文檔了解。
介紹
在介紹 YARP 的分布式跟蹤之前,我們先來了解一下什么是分布式跟蹤。
當我們構(gòu)建大型的應(yīng)用程序或系統(tǒng)時,通常會將其拆分成多個部分,這些部分可能運行在不同的計算機或進程中。這種分布式架構(gòu)有助于提高系統(tǒng)的可伸縮性和性能,但也增加了故障診斷的難度。分布式跟蹤就像是應(yīng)用程序的偵探工具,可以幫助工程師找出應(yīng)用程序中的問題,特別是那些可能橫跨多個計算機或進程的問題。
舉個例子,假設(shè)我們有一個典型的網(wǎng)頁服務(wù),用戶發(fā)送請求后,這個請求可能經(jīng)過負載均衡器,然后傳遞給后端的Web服務(wù)器進程,最后可能會涉及數(shù)據(jù)庫的多次查詢。使用分布式跟蹤,就像我們在調(diào)查一樁案件一樣,工程師可以追蹤整個請求的過程。他們能夠分辨每個步驟是否成功,每個步驟花費了多少時間,甚至可以記錄每個步驟產(chǎn)生的詳細信息。
作為 ASP.NET Core 的組件,YARP 可以像任何其他 Web 應(yīng)用程序一樣輕松集成到不同的跟蹤系統(tǒng)中??梢允褂靡韵鲁绦蚺渲梅植际礁?,詳情參考:
- OpenTelemetry ( 是一個與供應(yīng)商無關(guān)的庫,支持多種服務(wù) )
- Application Insights Application Insights ( 是由 Microsoft 提供的功能齊全的服務(wù) )
.NET 具有對分布式跟蹤的內(nèi)置可配置支持,YARP 利用這些支持來啟用此類現(xiàn)成方案。
使用自定義跟蹤標頭
在使用 .NET 不原生支持的傳播機制時,需要創(chuàng)建一個專門的傳播器(DistributedContextPropagator)來處理該機制的上下文信息傳遞。
YARP 會移除 DistributedContextPropagator.Fields( 這是DistributedContextPropagator中的一個屬性或字段,用于存儲與上下文傳播相關(guān)的信息 ) 中的任何標頭,以便在 Inject 調(diào)用期間,傳播器可以重新添加它們到請求中。 這個步驟是為了在整個傳播過程中有效地管理標頭信息,以確保它們被適當?shù)靥幚砗蛡鬟f。
透傳代理
如果不希望代理主動參與跟蹤,并希望保留所有跟蹤標頭,您可以通過將SocketsHttpHandler.ActivityHeadersPropagator 設(shè)置為null來實現(xiàn)。這表示代理將保持對跟蹤標頭的透明傳遞,而不會主動干預(yù)。
services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);
示例
1.創(chuàng)建項目
dotnet new web -n YARP.Metrics -f net6.0
2.添加項目引用
<ItemGroup>
<PackageReference Include="Yarp.Telemetry.Consumption" Version="2.1.0" />
</ItemGroup>
這個是 YARP 提供的庫,用來監(jiān)聽代理操作的各個階段,從而收集有關(guān)請求處理的詳細信息和性能指標。
在內(nèi)部,
YARP使用EventSource來收集來自許多用于處理請求的子系統(tǒng)的遙測事件和指標。要監(jiān)聽這些指標,需要在 DI(依賴注入)中注冊實現(xiàn)每個功能接口的類。以下是該類庫提供的功能:
功能概述:
- Proxy(代理):代表整個代理操作,包括成功或失敗。
- 事件包括:
- 代理請求的啟動和停止時
- 請求/響應(yīng)主體處理時
- 指標包括:
- 啟動的請求數(shù)量
- 進行中的請求數(shù)量
- 失敗的請求數(shù)量
- Kestrel:處理傳入請求的 Web 服務(wù)器。
- 事件包括:
- 請求的啟動/停止或失敗時
- 指標包括:
- 連接速率 - 每秒打開的連接數(shù)
- 總連接數(shù)
- TLS 握手次數(shù)
- 入站隊列長度
- Http:用于向目標服務(wù)器發(fā)出出站請求的 HttpClient。
- 事件包括:
- 連接創(chuàng)建時
- 請求的啟動/停止或失敗時
- 標頭/內(nèi)容發(fā)送/接收時
- 請求在連接可用時出隊列時
- 指標包括:
- 啟動的出站請求數(shù)量
- 失敗的請求數(shù)量
- 活動請求數(shù)量
- 出站連接數(shù)量
- Sockets:涉及連接嘗試的事件和有關(guān)發(fā)送和接收的數(shù)據(jù)量的指標。
- NameResolution:涉及名稱解析嘗試的事件和有關(guān)目標的 DNS 查詢的指標。
- NetSecurity:涉及 SslStream 握手的事件和有關(guān)每個協(xié)議的握手數(shù)量和延遲的指標。
3.關(guān)鍵文件
- ForwarderTelemetryConsumer(監(jiān)聽來自代理遙測的事件,記錄與代理請求處理的高級別過程相關(guān)的時序和信息。)
- HttpClientTelemetryConsumer(監(jiān)聽來自 HttpClient 遙測的事件,記錄與目標服務(wù)器的出站請求和響應(yīng)相關(guān)的時序和信息。)
- PerRequestMetrics(存儲按每個請求計算的指標的類。實例在請求的整個生命周期內(nèi)存儲在 AsyncLocal 存儲中。)
- PerRequestYarpMetricCollectionMiddleware(處理請求的第一步和最后一步。它初始化每個請求的指標,并在請求結(jié)束時記錄結(jié)果。)
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();
// 用于收集有關(guān)代理轉(zhuǎn)發(fā)的常規(guī)指標的接口
services.AddMetricsConsumer<ForwarderMetricsConsumer>();
// 將使用者注冊到代理轉(zhuǎn)發(fā)器遙測的事件
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.運行項目
接下來我們運行項目,就可以看到代理請求的一些指標數(shù)據(jù):
總結(jié)
到這里分布式跟蹤篇章也已經(jīng)結(jié)束了,它在分布式系統(tǒng)中尤為重要,可以分析性能瓶頸,定位錯誤和異常。而且收集的這些遙測數(shù)據(jù)(指標)可以導(dǎo)出到多種不同的后端存儲或可視化工具中。比如:Zipkin、Jaeger、Prometheus,這都是后話了。有興趣的小伙伴自己研究吧。相關(guān)代碼已上傳Github,關(guān)鍵文件也都有注釋。至此 YARP 的學(xué)習(xí)就先告一段落了。還有很多省略的章節(jié)(比如:中間件、HTTPS和TLS、GRPC等等)。想要了解更多的小伙伴可以自己去官網(wǎng)的文檔了解。
總結(jié)
以上是生活随笔為你收集整理的Welcome to YARP - 8.分布式跟踪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软加入 Blender 基金会
- 下一篇: 以金开头的成语有哪些啊?