共用方式為


YARP 擴充性:設定提供者

簡介

基本 Yarp 範例顯示從 appsettings.json載入的 Proxy 組態。 相反地,您可以從您選擇的來源以程序設計方式載入 Proxy 組態。 您可以藉由提供幾個實作 IProxyConfigProviderIProxyConfig 的類別來執行此動作。

如需自定義組態提供者的範例,請參閱 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