.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();
});
}
原文链接:https://www.cnblogs.com/ysmc/p/16727084.html
.NET 反向代理 YARP 自定义配置提供程序(Configuration Providers)的更多相关文章
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)
阅读目录: 1.需求背景介绍(Model元数据设置项应该与View绑定而非ViewModel) 1.1.确定问题域范围(可以使用DSL管理问题域前提是锁定领域模型) 2.迁移ViewModel设置到外 ...
- 扒一扒.NET Core的环境配置提供程序
很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提供程序 ...
- nginx反向代理设置自定义错误页面
为nginx反向代理设置自定义错误页面 转:https://blog.csdn.net/u014433030/article/details/77507839 如果我们的nginx配置了反向代理,如下 ...
- .NET 反向代理-YARP 根据域名转发
前段时间发布过一个关于 YARP 的简单介绍,感兴趣的小伙伴恭请移步看看 .NET 反向代理-YARP - 一事冇诚 - 博客园 (cnblogs.com) 作为反向代理,必不可少的当然是根据域名代理 ...
- Nginx反向代理负载均衡配置
1.反向代理概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...
- .NET Core开发实战(第11课:文件配置提供程序)--学习笔记
11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...
- [C#]使用 C# 代码实现拓扑排序 dotNet Core WEB程序使用 Nginx反向代理 C#里面获得应用程序的当前路径 关于Nginx设置端口号,在Asp.net 获取不到的,解决办法 .Net程序员 初学Ubuntu ,配置Nignix 夜深了,写了个JQuery的省市区三级级联效果
[C#]使用 C# 代码实现拓扑排序 目录 0.参考资料 1.介绍 2.原理 3.实现 4.深度优先搜索实现 回到顶部 0.参考资料 尊重他人的劳动成果,贴上参考的资料地址,本文仅作学习记录之用. ...
- .NET 反向代理-YARP
什么是 YARP YARP (另一个反向代理) 设计为一个库,提供核心代理功能,你可以根据应用程序的特定需求进行自定义. YARP 是使用 .NET的基础架构构建在 .NET上的.YARP 的主要不同 ...
随机推荐
- Webpack干货系列 | Webpack5 怎么处理字体图标、图片资源
程序员优雅哥(youyacoder)简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构. 本文摘要:主要讲解在不需要引入额外的loader的条件下运用Webp ...
- vite搭建一个vue2的框架
01-创建一个基础的模板框架 npm init vite@latest 02-安装依赖 npm install npm install vue@2.x vue-template-compiler@2 ...
- 外贸ERP系统哪些模块比较重要?得具备什么功能?
我国的外贸企业众多,涉及到多个行业,受疫情的影响,部分企业面临着极大的发展难题.而想要更好的在市场当中生存,除了要有更敏锐的市场嗅觉,也要有更大胆的创新.在外贸ERP系统的发展之下,会得到更多企业的青 ...
- 基于OpenCV实现对图片及视频中感兴趣区域颜色识别
基于OpenCV实现图片及视频中选定区域颜色识别 近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步 ...
- SPFA算法(SLF优化)2022.7.8更新
SPFA可能会被卡掉,能用dijkstra就别用SPFA,代码较长,但我已尽力做到解释,请耐心看下去,存储为邻接表存储. #include<bits/stdc++.h> #define i ...
- 《Python编程:从入门到实践》第十八章笔记:Django最基本用法笔记
最近在看Python编程:从入门到实践,这是这本书"项目3 Web应用程序"第18章的笔记.记录了django最基本的一些日常用法,以便自己查阅. 可能是我的这本书版本比较老,书上 ...
- Ubu18远程登录密匙设置
Ubu18设置远程密匙登录 相关文件 /etc/ssh/sshd_config 注意vscode使用博客园插件需要进行端口转发,在vscode端口处设置41385 本地生成密匙,任选一种,这里只介绍第 ...
- 日夕如是寒暑不间,基于Python3+Tornado6+APScheduler/Celery打造并发异步动态定时任务轮询服务
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_220 定时任务的典型落地场景在各行业中都很普遍,比如支付系统中,支付过程中因为网络或者其他因素导致出现掉单.卡单的情况,账单变成了 ...
- CSS3 基础学习
CSS基础学习 当前进度[P78] 参考资料 视频链接:https://www.bilibili.com/video/BV14J4114768 菜鸟教程:https://www.runoob.com/ ...
- [LNOI2022]盒
\(LNOI2022\)盒 由于是加的形式,那么可以套路的拆贡献,枚举每条边的贡献就好了 \(40pts\) //比较显然的事情 //首先确定了一个B数组之后 //最小的移动应该是 //设左右两侧比原 ...