這裡有一款寶藏反向代理

微軟技術棧發表於2022-02-04

YARP 1.0已經發布了,現在可以從 NuGet 下載。YARP(Yet Another Reverse Proxy)是使用 .NET 構建的高度可定製的反向代理。YARP 與其他反向代理的最大區別在於它是如何構建和打包的——YARP 作為庫和示例提供,展示瞭如何建立根據特定場景的需求定製的代理。

什麼是反向代理?

反向代理用於偵聽傳入的 HTTP 請求並根據請求的內容將請求轉發到適當的伺服器。與在第 4 層 (TCP/IP) 起作用的典型防火牆/路由器不同,反向代理通常在第 7 層工作,因此它們理解 http 並基於 http 欄位工作。

當 YARP 代理請求時,它會處理來自客戶端的 HTTP 連線,然後建立自己到目標伺服器的連線,雙方都可以從連線池中受益。

a09ca834549d656f93ba6524ed6036ba.png

使用反向代理有很多優點:

  • 它充當站點或一組服務的公共端點,使暴露的 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。

  1. 如果尚未從 https://dotnet.microsoft.com/... 安裝,請安裝 .NET 6
  2. 使用建立一個新的 Web 專案
    dotnet new web --name MyYarpProxy
  3. 新增對 YARP nuget 包的引用:

    dotnet add package MyYarpProxy Yarp.ReverseProxy
  4. 將 program.cs 中的程式碼替換為:
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

var app = builder.Build();

app.MapReverseProxy();

app.Run();
  1. 將 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:5000https://localhost:5001 並將任何請求路由到 https://httpbin.org(一個用於 http 除錯的有用站點),通過配置新增

YARP 1.0中有什麼

此 YARP 1.0 版本包括以下功能:

配置

  • YARP 配置定義了路由和目的地。它可以通過以下方式提供:
  1. 靜態配置檔案,具有動態更新的檔案更改檢測
  2. 與其他來源介面的程式設計配置可擴充套件性
  • 對於超大規模託管,路由可以是完全動態的,由應用程式程式碼確定,並由 YARP 根據每個請求進行處理

路由和入站連線

代理和出站連線

診斷

  • 監控效能的指標
  • 記錄以詳細跟蹤每個請求

一般的

效能

代理的效能將取決於許多因素:

  • 客戶端對代理使用的 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

相關文章