簡介
基本 Yarp 範例顯示從 appsettings.json載入的 Proxy 組態。 相反地,您可以從您選擇的來源以程序設計方式載入 Proxy 組態。 您可以藉由提供幾個實作 IProxyConfigProvider 和 IProxyConfig 的類別來執行此動作。
如需自定義組態提供者的範例,請參閱 ReverseProxy.Code.Sample 。
您可以使用 組態篩選,在載入順序期間修改組態。
結構
IProxyConfigProvider 具有應該傳回 GetConfig() 實例的單一方法。 IProxyConfig 有目前路由和叢集的清單,以及 IChangeToken ,以便在此資訊過期且應重載時通知代理,這會導致再次呼叫 GetConfig()。
路線
routes 區段是未排序的具名路由集合。 路由包含比對及其相關設定。 路由至少需要下列欄位:
- RouteId - 唯一名稱
- ClusterId - 是指叢集區段中的項目名稱。
- Match - 包含 Hosts 陣列或路徑模式字串。 Path 是 ASP.NET Core 路由範本,可定義為 這裡所述。
標頭、授權、CORS,以及其他路由式原則,可以在每個路由條目上設定。 如需其他欄位,請參閱 RouteConfig。
Proxy 會套用指定的比對準則和原則,然後將要求傳遞至指定的叢集。
集群
叢集區段是具名叢集的未排序集合。 叢集主要包含具名目的地及其位址的集合,其中任何一個都被視為能夠處理指定路由的要求。 Proxy 會根據路由和叢集組態來處理要求,以選取目的地。
如需其他欄位,請參閱 ClusterConfig。
在記憶體設定中
InMemoryConfigProvider 實作IProxyConfigProvider,並藉由呼叫LoadFromMemory,在程式碼中直接指定路由和叢集。
services.AddReverseProxy().LoadFromMemory(routes, clusters);
若要稍後更新組態,請從服務容器解析 InMemoryConfigProvider ,並使用新的路由和叢集清單呼叫 Update 。
httpContext.RequestServices.GetRequiredService<InMemoryConfigProvider>().Update(routes, clusters);
生命週期
新創公司
IProxyConfigProvider 應該在 DI 容器中註冊為單例。 在啟動時,Proxy 會解析這個實體並呼叫 GetConfig()。 在此第一次呼叫時,提供者可以選擇:
- 如果提供者因任何原因而無法產生有效的 Proxy 組態,則擲回例外狀況。 這可防止應用程式啟動。
- 在載入配置時同步地阻擋。 這會封鎖應用程式開始,直到有有效的路由數據可用為止。
- 或者,它可能會選擇在背景載入組態時傳回空
IProxyConfig的實例。 當組態可用時,提供者必須觸發IChangeToken。
Proxy 會驗證指定的組態,如果無效,則會擲回例外狀況,以防止應用程式啟動。 提供者可以使用 IConfigValidator 預先驗證路由和叢集,並採取其認為適當的動作,例如排除無效的專案,來避免這種情況。
原子數
提供給 Proxy 的組態物件和集合應該是唯讀的,一旦透過 將它們交給 Proxy GetConfig(),就不應加以修改。
重新載入
IChangeToken如果支援ActiveChangeCallbacks,一旦代理處理初始組態,就會向這個令牌註冊回調。 如果提供者不支援回呼功能,則每 5 分鐘會輪詢 HasChanged 一次。
當提供者想要提供新的組態給 Proxy 時,它應該:
- 在背景載入該組態。
- 路由和叢集物件是不可變的,因此必須針對任何新數據建立新的實例。
- 可以重複使用未變更路由和叢集的物件,或建立新的實例 - 變更將會經由比對差異來偵測。
- 選擇性地使用 IConfigValidator 驗證組態,然後只發出來自先前
IChangeToken實例的訊IProxyConfig號,指出有新的數據可供使用。 Proxy 會再次呼叫GetConfig()以擷取新的數據。
重新載入組態與第一次載入組態之間有重要的差異。
- 新的組態將會與當前組態比較,並且只會更新修改過的路由或叢集。 更新會以原子性方式套用,而且只會影響新的請求,不會影響目前正在處理的請求。
- 重載程式中的任何錯誤都會記錄並隱藏。 應用程式會繼續使用最後一個已知的良好組態。
- 如果
GetConfig()擲回 Proxy 將無法接聽未來的變更,因為IChangeToken是單一使用。
一旦驗證並套用新的組態之後,代理伺服器就會向新的 IChangeToken 註冊回呼。 請注意,如果連續發出多個重載訊號,Proxy 可能會略過某些重載,並在準備好后立即載入下一個可用的組態。 每個 IProxyConfig 都包含完整的組態狀態,因此不會遺失任何專案。
多個配置來源
自 1.1 起,YARP 支援從多個來源載入 Proxy 組態。 多個 IProxyConfigProvider可以註冊為單一服務,而且所有都會解析和合併。 來源可能相同或不同類型的類型,例如 IConfiguration 或 InMemory。 路由可以參考來自其他來源的叢集。 請注意,不支持合併來自指定路由或叢集之不同來源的部分設定。
services.AddReverseProxy()
.LoadFromConfig(Configuration.GetSection("ReverseProxy1"))
.LoadFromConfig(Configuration.GetSection("ReverseProxy2"));
或
services.AddReverseProxy()
.LoadFromMemory(routes, clusters)
.LoadFromConfig(Configuration.GetSection("ReverseProxy"));
範例
InMemoryConfigProvider 提供已手動載入路由和叢集的範例IProxyConfigProvider。