Welcome to YARP - 1.認識YARP並搭建反向代理服務
這篇文章結束,YARP 的學習就先告一段落了。還有很多省略的章節(比如:中介軟體、HTTPS和TLS、GRPC等等)。想要了解更多的小夥伴可以自己去官網的檔案瞭解。
在介紹 YARP
的分散式跟蹤之前,我們先來了解一下什麼是分散式跟蹤。
當我們構建大型的應用程式或系統時,通常會將其拆分成多個部分,這些部分可能執行在不同的計算機或程序中。這種分散式架構有助於提高系統的可伸縮性和效能,但也增加了故障診斷的難度。分散式跟蹤就像是應用程式的偵探工具,可以幫助工程師找出應用程式中的問題,特別是那些可能橫跨多個計算機或程序的問題。
舉個例子,假設我們有一個典型的網頁服務,使用者傳送請求後,這個請求可能經過負載均衡器,然後傳遞給後端的Web伺服器程序,最後可能會涉及資料庫的多次查詢。使用分散式跟蹤,就像我們在調查一樁案件一樣,工程師可以追蹤整個請求的過程。他們能夠分辨每個步驟是否成功,每個步驟花費了多少時間,甚至可以記錄每個步驟產生的詳細資訊。
作為 ASP.NET Core
的元件,YARP
可以像任何其他 Web
應用程式一樣輕鬆整合到不同的跟蹤系統中。可以使用以下程式設定分散式跟蹤,詳情參考:
.NET
具有對分散式跟蹤的內建可設定支援,YARP
利用這些支援來啟用此類現成方案。
在使用 .NET
不原生支援的傳播機制時,需要建立一個專門的傳播器(DistributedContextPropagator
)來處理該機制的上下文資訊傳遞。
YARP
會移除 DistributedContextPropagator.Fields
( 這是DistributedContextPropagator
中的一個屬性或欄位,用於儲存與上下文傳播相關的資訊 ) 中的任何檔頭,以便在 Inject
呼叫期間,傳播器可以重新新增它們到請求中。 這個步驟是為了在整個傳播過程中有效地管理檔頭資訊,以確保它們被適當地處理和傳遞。
如果不希望代理主動參與跟蹤,並希望保留所有跟蹤檔頭,您可以通過將SocketsHttpHandler.ActivityHeadersPropagator
設定為null來實現。這表示代理將保持對跟蹤檔頭的透明傳遞,而不會主動干預。
services.AddReverseProxy()
.ConfigureHttpClient((context, handler) => handler.ActivityHeadersPropagator = null);
dotnet new web -n YARP.Metrics -f net6.0
<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 握手的事件和有關每個協定的握手數量和延遲的指標。
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/"
}
}
}
}
}
}
接下來我們執行專案,就可以看到代理請求的一些指標資料:
到這裡分散式跟蹤篇章也已經結束了,它在分散式系統中尤為重要,可以分析效能瓶頸,定位錯誤和異常。而且收集的這些遙測資料(指標)可以匯出到多種不同的後端儲存或視覺化工具中。比如:Zipkin、Jaeger、Prometheus,這都是後話了。有興趣的小夥伴自己研究吧。相關程式碼已上傳Github,關鍵檔案也都有註釋。至此 YARP
的學習就先告一段落了。還有很多省略的章節(比如:中介軟體、HTTPS和TLS、GRPC等等)。想要了解更多的小夥伴可以自己去官網的檔案瞭解。