<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

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

      介紹

        基本 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();
          });
      }

       

      原文鏈接:http://www.rzrgm.cn/ysmc/p/16727084.html

      posted @ 2022-09-25 00:43  一事冇誠  閱讀(3016)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产高清不卡视频| 亚洲中文字幕无码久久2017| 色久综合色久综合色久综合| 乌苏市| 偷拍久久大胆的黄片视频| 欧美乱妇高清无乱码免费| 亚洲欧美人成电影在线观看| 国产亚洲另类无码专区| 成人无码h真人在线网站| 他掀开裙子把舌头伸进去添视频 | 国产免费高清69式视频在线观看| 国产午夜精品久久久久免费视 | 国产99视频精品免费视频76| 欧美日本精品一本二本三区| 性一交一乱一乱一视频| 国产乱妇乱子视频在播放| 国产丰满乱子伦无码专区| 亚洲AV无码久久精品日韩| 麻豆一区二区三区香蕉视频| 国产精品亚洲综合色区丝瓜| 国产一区二区黄色激情片| 亚洲午夜爱爱香蕉片| 3d动漫精品一区二区三区| 99久久精品国产熟女拳交| 野花社区www视频日本| 中国xxx农村性视频| 国产办公室秘书无码精品99| 大胸少妇午夜三级| 亚洲激情av一区二区三区| 日韩在线观看精品亚洲| 国产迷姦播放在线观看| 精品国产精品中文字幕| 日韩精品国产另类专区| 国产欧亚州美日韩综合区| 国产精品国三级国产av| 国产精品天干天干综合网| 欧美videos粗暴| 一区二区三区午夜无码视频| 亚洲第一国产综合| 思热99re视热频这里只精品| 在线精品国产中文字幕|