介绍

  基本 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. 4-3 Spring MVC框架-02

    Spring MVC框架-02 Ⅰ.RESTful基础 是一种设计风格和开发方式 1.get和post请求区别: get post 获取请求 上传请求 请求参数在地址栏URL 请求参数在请求体里面 U ...

  2. harbor之HTTPS安装

    1.下载解压 # tar -xvf harbor-offline-installer-v1.7.6.tgz # cd /harbror 2.下载python2.7 # apt install pyth ...

  3. fpga中的存储器

    fpga中的存储器三种:RAM,ROM,FIFO. RAM和ROM已经比较熟悉了,记录一下FIFO. FIFO:first in first out ,顺序存取,先入先出.是一种数据缓存器,用来作不同 ...

  4. 平衡树——splay 一

    splay 一种平衡树,同时也是二叉排序树,与treap不同,它不需要维护堆的性质,它由Daniel Sleator和Robert Tarjan(没错,tarjan,又是他)创造,伸展树是一种自调整二 ...

  5. 什么是 Base64 ?

    Base64 是什么? Base64是一种二进制到文本的编码方式.如果要更具体一点的话,可以认为它是一种将 byte数组编码为字符串的方法,而且编码出的字符串只包含ASCII基础字符,就是包括小写字母 ...

  6. IDEA自定义liveTemplates(方法模板、类模板)

    IDEA自定义liveTemplates(方法模板.类模板) 前言,搞这个模板有何意义? 降低大家写方法注释的成本,统一风格.有时候不是开发同学不爱写注释,而是没有合适的载体和空间. IDEA模板设置 ...

  7. ASP.NET Core 6框架揭秘实例演示[30]:利用路由开发REST API

    借助路由系统提供的请求URL模式与对应终结点之间的映射关系,我们可以将具有相同URL模式的请求分发给与之匹配的终结点进行处理.ASP.NET的路由是通过EndpointRoutingMiddlewar ...

  8. [b01lers2020]Welcome to Earth-1

    1.打开之后界面如下,查看源代码信息,发现chase文件,结果如下: 2.访问chase文件会一直跳转到die界面,那就只能抓包进行查看,发现leftt文件,结果如下: 3.访问leftt文件并查看源 ...

  9. Point2和Point3类定义

    支持以下图中的运算 类声明: class Point2 { public: Point2(); ~Point2(); Point2(ldouble a); Point2(ldouble a, ldou ...

  10. jQuery 查找父元素的函数 parent 和 parents 的区别

    函数 描述 parent([expr]) 查找子节点childNode的父节点,不包括祖先节点 parents([expr]) 查找子节点childNode的父节点,包括祖先节点 Talk is ch ...