YARP 1.0已經發布了,現在可以從 NuGet 下載。YARP(Yet Another Reverse Proxy)是使用 .NET 構建的高度可定製的反向代理。YARP 與其他反向代理的最大區別在於它是如何構建和打包的——YARP 作為庫和示例提供,展示瞭如何建立根據特定場景的需求定製的代理。
什麼是反向代理?
反向代理用於偵聽傳入的 HTTP 請求並根據請求的內容將請求轉發到適當的伺服器。與在第 4 層 (TCP/IP) 起作用的典型防火牆/路由器不同,反向代理通常在第 7 層工作,因此它們理解 http 並基於 http 欄位工作。
當 YARP 代理請求時,它會處理來自客戶端的 HTTP 連線,然後建立自己到目標伺服器的連線,雙方都可以從連線池中受益。
使用反向代理有很多優點:
- 它充當站點或一組服務的公共端點,使暴露的 url 空間獨立於實際實現
- 將呼叫轉發到後端伺服器以執行實際工作,平衡它們之間的負載
- 可以從後端伺服器解除安裝工作,例如 TLS 加密、Auth 2、壓縮、快取
什麼是 YARP
YARP 是一個提供基於 .NET 的開源反向代理伺服器的專案。它始於大約兩年前,當時我們注意到微軟團隊提出的一種問題模式,這些團隊要麼為他們的服務構建反向代理,要麼一直在詢問構建一個反向代理的 API 和技術。我們決定讓他們一起研究一個通用的解決方案,這就是 YARP。
YARP 是一個反向代理工具包,用於使用 ASP.NET 和 .NET 的基礎設施並在 .NET 中構建快速代理伺服器。YARP 的關鍵區別在於它的設計易於定製和調整,以匹配每個部署場景的特定需求。
我們在與建立 Microsoft 服務的團隊交談時發現,每項服務都略微偏離常規,他們都在構建自己的解決方案,或者嘗試自定義第三方代理。雖然他們有 HTTP/1.1 的解決方案,但他們需要 HTTP/2——通常用於 gRPC,而 HTTP/2 使用二進位制幀格式,實現起來要複雜得多。YARP 使開發人員能夠完全控制,同時利用經過驗證的 ASP.NET Core 和 .NET 功能集,以及 C#(或其他 .NET 語言)的生產力。
YARP 插入 ASP .NET 作為處理傳入請求的中介軟體,YARP 提供了兩個主要的使用和定製路徑:
- 作為一個全功能的代理——YARP 使用配置來定義一組基於 URL 模式的路由,這些路由對映到目標伺服器的叢集,叢集中的每個目標都應該能夠處理叢集對映到的路由的請求。目標列表根據會話親和性和伺服器執行狀況進行過濾,然後使用負載平衡演算法在剩餘目標之間進行選擇。其中的每個部分都可以通過配置進行自定義,客戶可以根據需要新增額外的模組或替換庫存模組。配置系統是可擴充套件的,因此可以從諸如 Service Fabric 之類的源中提取路由和目標資訊。
- 或者,對於高度自定義的環境,可以直接呼叫 YARP 請求轉發器,繞過路由、負載平衡模組等。例如,這就是 Azure 應用服務使用 YARP 將請求路由到特定例項的方式,例項所在的位置按需旋轉。
這些甚至可以在同一個程式中一起使用,根據路由在它們之間切換。
YARP 入門
與作為可以擴充套件的可執行檔案提供的其他代理不同,YARP 反轉了模型。您使用呼叫 YARP 的模板建立代理,這樣可以更輕鬆地將您自己的自定義和功能新增到 YARP。
以下示例基於 .NET 6 的新簡化模板。示例適用於 .NET Core 3.1 和 .NET 5。
- 如果尚未從 https://dotnet.microsoft.com/... 安裝,請安裝 .NET 6
- 使用建立一個新的 Web 專案
dotnet new web --name MyYarpProxy
新增對 YARP nuget 包的引用:
dotnet add package MyYarpProxy Yarp.ReverseProxy
- 將 program.cs 中的程式碼替換為:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
- 將 appsettings.json 中的配置檔案替換為:
{
"Urls": "http://localhost:5000;https://localhost:5001",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"minimumroute": {
"ClusterId": "minimumcluster",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"minimumcluster": {
"Destinations": {
"httpbin.org": {
"Address": "https://httpbin.org/"
}
}
}
}
}
}
這將建立一個代理來監聽 http://localhost:5000 和 https://localhost:5001 並將任何請求路由到 https://httpbin.org(一個用於 http 除錯的有用站點),通過配置新增。
YARP 1.0中有什麼
此 YARP 1.0 版本包括以下功能:
配置
- YARP 配置定義了路由和目的地。它可以通過以下方式提供:
- 靜態配置檔案,具有動態更新的檔案更改檢測
- 與其他來源介面的程式設計配置可擴充套件性
- 對於超大規模託管,路由可以是完全動態的,由應用程式程式碼確定,並由 YARP 根據每個請求進行處理
路由和入站連線
- YARP 可以基於SNI/Host的多個站點和路由
- 路由可以基於請求 URL 和標頭值
- 主動和被動健康檢查以確認目的地的可用性,並過濾掉不良請求
- Session Affinity 會將後續請求路由到同一目的地基於請求的URL
- 用於跨目的地負載平衡的多種演算法
- 特定路由的身份驗證、授權和 CORS
代理和出站連線
- 傳入的請求 URL 可以在傳遞到目的地之前進行轉換
- 可以轉換請求和響應標頭
- 可以轉換Http方法(例如 POST 到 PUT)
- 到目的地的出站 http 連線是可配置的
- 代理新增與請求轉發相關的標準標頭
- gRPC 和 Web 套接字流量,包括流式傳輸
診斷
- 監控效能的指標
- 記錄以詳細跟蹤每個請求
一般的
- 代理具有云規模效能
- 文件
- 易於擴充套件——客戶可以新增中介軟體來自定義代理功能,例如路由、標頭操作
- 支援 .NET Core 3.1、.NET 5 和 .NET 6
效能
代理的效能將取決於許多因素:
- 客戶端對代理使用的 http 版本
- 目標代理使用的 http 版本
- 是否使用 TLS 加密
- 請求/響應標頭和內容有效負載的大小
我們有一組每天針對 YARP 和其他代理伺服器執行的基準。這是在實驗室中使用為測量 TechEmpower 基準而建立的“黃水晶”硬體定義進行測量的。結果使用 PowerBI 儀表板呈現,可用於與其他代理進行比較。例如,將 YARP 和 Envoy 的(傳入傳出協議)http-http1.1 和 https-https1.1 與 21 年 10 月的結果進行比較,如下所示:
可以在 https://aka.ms/aspnet/benchmarks 找到儀表板。在那裡,頁面底部是一個用於選擇頁面的小部件。代理結果在第 16 頁。
提示:點選文字“1 of 21”將彈出一個頁面選單,其中“代理”可以直接選擇。
開源
YARP 正在作為一個開源專案進行開發和交付。它託管在https://github.com/microsoft/... 的 github 上。我們感謝大家的貢獻、問題和討論。
支援
YARP 支援由產品團隊(從事 YARP 工作的工程師)提供,該團隊由 ASP.NET 和核心庫網路團隊的成員組成。我們不提供 24/7 全天候支援或“隨身尋呼機”,但由於我們的團隊成員位於布拉格和雷德蒙德,因此我們通常具有良好的時區覆蓋率。應使用問題模板在 github 中報告錯誤,通常會在 24 小時內回覆。如果您發現安全問題,我們會要求您通過 Microsoft 安全響應中心 (MSRC) 進行報告。
我們將針對安全性或其他重大問題提供 1.0 服務。未來版本將考慮新功能。我們預計將在未來幾個月內開始釋出下一個版本的預覽版本。
下一步是什麼
反向代理的工作將繼續。我們在列表中為下一個版本工作的專案包括:
- 支援 HTTP/3 – 初步測試表明它大部分都可以工作,但我們希望在 ARP #1208中有一個可靠的實現
- 更多效能優化——我們將再次推動效能,並使用 YARP 將額外的效能特引入入.NET
- 使用 LLHTTP 提供對出站連線的更多控制和更有效的標頭處理。LLHTTP 是一個實驗,旨在開發比 HttpClient 更低階別的 HTTP API,以更好地控制 HTTP 請求的發出和處理方式。
- 支援 Service Fabric – YARP 的早期預覽版包括一個用於 Service Fabric 整合的模組。這對於使用 Service Fabric 的站點典型的大規模站點部署來說是不夠的。我們正在與 SF 團隊成員合作,實施更強大和可擴充套件的解決方案,用於根據SF 資料動態配置代理#257
- @jkotalik 為 Kubernetes 整合編寫了一個原型實現。從事 YARP 工作的 Microsoft 團隊成員不是 k8s 部署方面的專家,因此我們正在與社群成員合作以進一步開發此整合。#200