介绍

  基本 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

.NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)的更多相关文章

  1. 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中

    [大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...

  2. .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)

    阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...

  3. 扒一扒.NET Core的环境配置提供程序

    很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提供程序 ...

  4. nginx反向代理设置自定义错误页面

    为nginx反向代理设置自定义错误页面 转:https://blog.csdn.net/u014433030/article/details/77507839 如果我们的nginx配置了反向代理,如下 ...

  5. .NET 反向代理-YARP 根据域名转发

    前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP - 一事冇诚 - 博客园 (cnblogs.com) 作为反向代理,必不可少的当然是根据域名代理 ...

  6. Nginx反向代理负载均衡配置

    1.反向代理概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  7. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  8. [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果

    [C#]使用 C# 代码实现拓扑排序   目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...

  9. .NET 反向代理-YARP

    什么是 YARP YARP (另一个反向代理) 设计为一个库,提供核心代理功能,你可以根据应用程序的特定需求进行自定义. YARP 是使用 .NET的基础架构构建在 .NET上的.YARP 的主要不同 ...

随机推荐

  1. 【Unity学习笔记】掌握MoneBehavior中的重要属性、方法

    一.重要属性 1-1.获取自己依附的GameObject using System.Collections; using System.Collections.Generic; using Unity ...

  2. 分析 java.util.LinkedHashMap

    介绍 该实现与HashMap不同的是它维护一个双向链表,可以使HashMap有序.与HashMap一样,该类不安全. 结构 和HashMap的结构非常相似,只不过LinkedHashMap是一个双向链 ...

  3. 调和级数为什么是 O(logn) 的

    目录 调和级数 正片 调和级数 调和级数(Harmonic series)定义为 \[H(n)=\sum_{i=1}^n\dfrac 1i \] \(H\) 发散,证明看百度 . 正片 首先我们把 \ ...

  4. 1个小时!从零制作一个! AI图片识别WEB应用!

    0 前言 近些年来,所谓的人工智能也就是AI. 在媒体的炒作下,变得神乎其神,但实际上,类似于图片识别的AI,其原理只不过是数学的应用. 线性代数,概率论,微积分(著名的反向传播算法). 大家觉得这些 ...

  5. 上穷碧落下凡尘:Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_166 基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseac ...

  6. MySQL通配符与正则表达式

    通配符 通配符必须全文匹配时才为真,使用LIKE关键字 字符 示例 含义 _ "a_b" 任意一个字符"axb",其中x可以使任意字符,包括汉字 % " ...

  7. PyCharm 2022.2 发布了,支持最新 Python 3.11 和 PyScript 框架!

    来源:Jet Brains官网:翻译:Python猫 原文:https://blog.jetbrains.com/pycharm/2022/07/2022-2 通常而言,使用新潮的或者快速发展的技术, ...

  8. java学习第二天面向对象.day08

    this 在方法中表示调用当前方法的对象,this与主方法中对象类名调用是同理的,也是去指向堆中的地址. this可以解决成员变量和形参的问题 使用构造器还是setter方法 构造器:在创建对象的时侯 ...

  9. 部署 Vite 静态网站到 Gitee Pages

    开启仓库的 Gitee Pages 服务,部署目录 dist/: Vite 构建 build,输出到 dist 文件:取消 .gitignore 中的 dist: Vite preview 查看静态网 ...

  10. 【java】学习路径25-ArrayList类,Vector类,LinkedList类的使用和区别,Iterator迭代器的使用

    ArrayList的使用 ArrayList类:可变化长度的数组. 与一般的数组不同的是,其长度不固定,可以添加任意类型的数据. 也可以添加不同类型的数据,但是一般不这么做. ArrayList类位于 ...