1 YARP
YARP是一個專案,用於建立反向代理伺服器。它開始於我們注意到來自微軟內部團隊的一系列問題。他們要麼為其服務構建反向代理,要麼詢問 API 和用於構建 API 的技術。因此我們決定讓他們聚在一起開發一個通用解決方案,該解決方案形成了YARP。
YARP是一個反向代理工具包,用於使用 ASP.NET 和 .NET 中的基礎設施在 .NET 中構建代理伺服器。YARP 的主要區別是,它被設計為易於自定義和調整,以滿足不同方案的特定需求。YARP 插入ASP.NET管道以處理傳入請求,然後它擁有自己的子管道,用於執行將請求代理到後端伺服器的步驟。客戶可以新增其他module,或根據需要更換常備module。
隨著其開發已基本到位,我們製作了 YARP 的第一個正式版本(Preview 1),以便更好地協作並獲得反饋。
2 Preview 1 是什麼
-
- 核心代理的基礎結構
- 基於配置的路由定義
- 擴充套件性的管道模型
- Forwarded標頭(硬編碼)
- 目標 .NET Core 3.1 和 .NET Core 5
3 Preview 1 不包括
-
- 會話親和性(又稱會話保持)
- Forwarded標頭(可配置)
- 基於程式碼的路由定義和預請求路由
- 指標和日誌
- 效能調整
- 連線篩選
4 快速開始
Step 01 下載.net framework
YARP 適用於 .NET Core 3.1 或 .NET 5 Preview 4(或更高版本)。
Step 02 建立一個ASP.NET Core專案
Step 03 開啟專案,新增引用,確保其包含
<PropertyGroup>
<TargetFramework>netcoreapp5.0</TargetFramework>
</PropertyGroup>
和
<ItemGroup> <PackageReference Include="Microsoft.ReverseProxy" Version="1.0.0-preview.1.*" /> </ItemGroup>
Step 04 Startup.cs
YARP 當前使用配置檔案來定義代理的路由和終結點。在ConfigureServices方法中載入。
public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { services.AddReverseProxy() .LoadFromConfig(Configuration.GetSection("ReverseProxy")); }
Configure方法定義ASP.NET的請求處理管道。反向代理插入到ASP.NET的終結點路由,然後具有其自己的代理子管道。在這裡,可以新增代理管道模組(如負載均衡)來自定義請求的處理。
/// <summary> /// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. /// </summary> public void Configure(IApplicationBuilder app) { app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapReverseProxy(proxyPipeline => { proxyPipeline.UseProxyLoadBalancing(); }); }); }
Step 05 配置
YARP 的配置定義在appsettings.json中:
"ReverseProxy": { "Routes": [ { "RouteId": "app1", "BackendId": "backend1", "Match": { "Methods": [ "GET", "POST" ], "Host": "localhost", "Path": "/app1/" } }, { "RouteId": "route2", "BackendId": "backend2", "Match": { "Host": "localhost" } } ], "Backends": { "backend1": { "LoadBalancing": { "Mode": "Random" }, "Destinations": { "backend1_destination1": { "Address": "https://example.com:10000/" }, "backend1_destination2": { "Address": "http://example.com:10001/" } } }, "backend2": { "Destinations": { "backend2_destination1": { "Address": "https://example.com:10002/" } } } } }
-
- Backends:請求可以路由到的伺服器群集。
- Destinations:是用於指標、日誌記錄和會話保持的識別符號。
- Address:URL字首(基地址)
- Routes:根據請求的各個方面(如主機名、路徑、方法、請求標頭等)將傳入請求對映到後端群集。路由是有序的,因此,需要首先定義 app1 路由,因為 route2 將作為尚未匹配的所有路徑的 catchall。
好啦,先介紹到這裡。
原文連結