.NET 反向代理 YARP 自定義配置提供程式(Configuration Providers)

来源:https://www.cnblogs.com/ysmc/archive/2022/09/25/16727084.html
-Advertisement-
Play Games

介紹 基本 Yarp 示例顯示從 appsettings.json 載入的代理配置。相反,代理配置可以從您選擇的源以編程方式載入。您可以通過提供幾個實現 IProxyConfigProvider 和 IProxyConfig 的類來做到這一點。 可以使用配置過濾器在載入序列期間修改配置。 結構 IP ...


介紹

  基本 Yarp 示例顯示從 appsettings.json 載入的代理配置。相反,代理配置可以從您選擇的源以編程方式載入。您可以通過提供幾個實現 IProxyConfigProvider 和 IProxyConfig 的類來做到這一點。

  可以使用配置過濾器在載入序列期間修改配置。

結構

  IProxyConfigProvider 有一個方法應該返回一個 IProxyConfig 實例。 IProxyConfig 具有當前路由和集群的列表,以及在此信息過期並應重新載入時通知代理,這將導致再次調用(GetConfig()IChangeTokenGetConfig())

路線

  路由部分是命名路由的無序集合。路由包含匹配項及其相關配置。一條路線至少需要以下欄位:

  RouteId - 一個唯一的名稱

  ClusterId - 指集群部分中的條目名稱。

  Match - 包含 Hosts 數組或 Path 模式字元串。 Path 是一個 ASP.NET Core 路由模板,可以按照此處的說明進行定義。

  可以在每個路由條目上配置標頭、授權、CORS 和其他基於路由的策略。

  代理將應用給定的匹配條件和策略,然後將請求傳遞給指定的集群。

集群

  集群部分是命名集群的無序集合。集群主要包含命名目的地及其地址的集合,其中任何一個都被認為能夠處理給定路由的請求。代理將根據路由和集群配置處理請求以選擇目的地。

生命周期

啟動

  應該在 DI 容器中註冊為單例。啟動時,代理將解析此實例並調用 .在第一次調用時,提供者可以選擇:IProxyConfigProviderGetConfig()

  如果提供者出於任何原因無法生成有效的代理配置,則拋出異常。這將阻止應用程式啟動。

  在載入配置時同步阻塞。這將阻止應用程式啟動,直到有效的路線數據可用。

  或者,它可以選擇在後臺載入配置時返回一個空實例。提供者將需要在配置可用時觸發(IProxyConfigIChangeToken)

  代理將驗證給定的配置,如果它無效,將引發異常,阻止應用程式啟動。提供者可以通過使用 IConfigValidator 來預先驗證路由和集群並採取它認為適當的任何操作(例如排除無效條目)來避免這種情況。

原子性

  提供給代理的配置對象和集合應該是只讀的,一旦通過 .GetConfig() 傳遞給代理就不能修改

重新載入

  如果支持,一旦代理處理了初始配置集,它將使用此令牌註冊回調。如果提供者不支持回調,則每 5 分鐘輪詢一次(IChangeTokenActiveChangeCallbacksHasChanged)

  1、當提供者想要為代理提供新配置時,它應該:

  (1)在後臺載入該配置。

    a. 路由和集群對象是不可變的,因此必須為任何新數據創建新實例。

    b. 可以重新使用未更改的路由和集群的對象,或者可以創建新的實例 - 將通過區分它們來檢測更改。

  (2)可選地使用 IConfigValidator 驗證配置,然後才從先前的實例發出新數據可用的信號。代理將再次調用以檢索新數據(IChangeTokenIProxyConfigGetConfig())

  2、重新載入配置與第一次配置載入時存在重要差異。

  (1)新配置將與當前配置不同,並且只會更新修改後的路由或集群。更新將自動應用,並且只會影響新請求,而不影響當前正在進行的請求。

  (2)重新載入過程中的任何錯誤都將被記錄並抑制。應用程式將繼續使用上次已知的正確配置。

  (3)如果拋出代理將無法監聽未來的變化,因為 s 是一次性的(GetConfig()IChangeToken)

  驗證並應用新配置後,代理將使用新的 .請註意,如果連續發出多次重新載入信號,代理可能會跳過一些併在準備好後立即載入下一個可用配置。每個都包含完整的配置狀態,因此不會丟失任何內容(IChangeTokenIProxyConfig)

多個配置源

  從 1.1 開始,YARP 支持從多個來源載入代理配置。 多個可以註冊為單例服務,所有將被解析和組合。 源可以是相同或不同的類型,例如 IConfiguration 或 InMemory。 路由可以引用其他來源的集群。 請註意,不支持為給定路由或集群合併來自不同來源的部分配置(IProxyConfigProvider)

services.AddReverseProxy()
        .LoadFromConfig(Configuration.GetSection("ReverseProxy1"))
        .LoadFromConfig(Configuration.GetSection("ReverseProxy2"));

或者

services.AddReverseProxy()
        .LoadFromMemory(routes, clusters)
        .LoadFromConfig(Configuration.GetSection("ReverseProxy"));

Example

  以下是手動載入路由和集群的示例(IProxyConfigProvider)

using System.Collections.Generic;
using System.Threading;
using Microsoft.Extensions.Primitives;
using Yarp.ReverseProxy.Configuration;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class InMemoryConfigProviderExtensions
    {
        public static IReverseProxyBuilder LoadFromMemory(this IReverseProxyBuilder builder, IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
        {
            builder.Services.AddSingleton<IProxyConfigProvider>(new InMemoryConfigProvider(routes, clusters));
            return builder;
        }
    }
}

namespace Yarp.ReverseProxy.Configuration
{
    public class InMemoryConfigProvider : IProxyConfigProvider
    {
        private volatile InMemoryConfig _config;

        public InMemoryConfigProvider(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
        {
            _config = new InMemoryConfig(routes, clusters);
        }

        public IProxyConfig GetConfig() => _config;

        public void Update(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
        {
            var oldConfig = _config;
            _config = new InMemoryConfig(routes, clusters);
            oldConfig.SignalChange();
        }

        private class InMemoryConfig : IProxyConfig
        {
            private readonly CancellationTokenSource _cts = new CancellationTokenSource();

            public InMemoryConfig(IReadOnlyList<RouteConfig> routes, IReadOnlyList<ClusterConfig> clusters)
            {
                Routes = routes;
                Clusters = clusters;
                ChangeToken = new CancellationChangeToken(_cts.Token);
            }

            public IReadOnlyList<RouteConfig> Routes { get; }

            public IReadOnlyList<ClusterConfig> Clusters { get; }

            public IChangeToken ChangeToken { get; }

            internal void SignalChange()
            {
                _cts.Cancel();
            }
        }
    }
}

  下麵是它在 Startup.cs 中的調用方式:

public void ConfigureServices(IServiceCollection services)
{
    var routes = new[]
    {
        new RouteConfig()
        {
            RouteId = "route1",
            ClusterId = "cluster1",
            Match = new RouteMatch
            {
                Path = "{**catch-all}"
            }
        }
    };
    var clusters = new[]
    {
        new ClusterConfig()
        {
            ClusterId = "cluster1",
            Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
            {
                { "destination1", new DestinationConfig() { Address = "https://example.com" } }
            }
        }
    };

    services.AddReverseProxy()
        .LoadFromMemory(routes, clusters);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapReverseProxy();
    });
}

 

原文鏈接:https://www.cnblogs.com/ysmc/p/16727084.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、VSCode 創建Django 工程 VSCode 官方: https://code.visualstudio.com 1 mysite(項目名),創建Django 項目,可以和虛擬環境放在同一目錄,也可以放在虛擬環境的文件夾里。 django-admin startproject mysite ...
  • 摘要:傅里葉變換主要是將時間域上的信號轉變為頻率域上的信號,用來進行圖像除噪、圖像增強等處理。 本文分享自華為雲社區《[Python圖像處理] 二十二.Python圖像傅里葉變換原理及實現》,作者:eastmount。 本文主要講解圖像傅里葉變換的相關內容,在數字圖像處理中,有兩個經典的變換被廣泛應 ...
  • 2022-09-24 在創建Django項目時,出現了 錯誤,查了一下,發現要創建一個Django項目,需要先使用命令: python -m pip install pytz 安裝一個“時區模塊”。一般錯誤提示中出現“xxx”模塊沒有發現,大概率是要進行安裝一個模塊或者其他。 之後創建一個Djang ...
  • ###一、介紹 #介紹:使用requests可以模擬瀏覽器的請求,比起之前用到的urllib,requests模塊的api更加便捷(本質就是封裝了urllib3) #註意:requests庫發送請求將網頁內容下載下來以後,並不會執行js代碼,這需要我們自己分析目標站點然後發起新的request請求 ...
  • 定義 隊列是一個有序列表,可以用數組或是鏈表來實現。 遵循先入先出的原則。即:先存入隊列的數據,要先取出。後存入的要後取出 模擬思路 隊列本身是有序列表,若使用數組的結構來存儲隊列的數據,則隊列數組的聲明如下圖, 其中 maxSize 是該隊列的最大容量 因為隊列的輸出、輸入是分別從前後端來處理,因 ...
  • 前言 開發環境 python 3.8: 解釋器 pycharm: 代碼編輯器 requests 發送請求 pyecharts 繪製圖表 pandas 讀取數據 爬蟲案例思路流程: 一. 數據來源分析: 確定需求, 採集那個網站上面什麼數據 抓包分析, 通過開發者工具進行抓包分析<瀏覽器自帶工具>開發 ...
  • 我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 江蘇省無錫市梁溪區人民法院審結了 ...
  • python爬蟲爬取國家科技報告服務系統數據,共計30餘萬條 按學科分類【中圖分類】 共計三十餘萬條科技報告數據 爬取的網址:https://www.nstrs.cn/kjbg/navigation !!! 如果要完整地跑起來代碼,需要先看一下我的這篇博客,完成IP代理池的相關配置: https:/ ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...