Welcome to YARP - 1.認識YARP並搭建反向代理服務 Welcome to YARP - 2.配置功能 2.1 - 配置文件(Configuration Files) 2.2 - 配置提供者(Configuration Providers) 2.3 - 配置過濾器(Configur ...
Welcome to YARP - 1.認識YARP並搭建反向代理服務
- 2.1 - 配置文件(Configuration Files)
- 2.2 - 配置提供者(Configuration Providers)
- 2.3 - 配置過濾器(Configuration Filters)
這篇文章結束,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等等)。想要瞭解更多的小伙伴可以自己去官網的文檔瞭解。