目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.负载均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份验证和授权

Welcome to YARP - 6.压缩、缓存

Welcome to YARP - 7.目标健康检查

Welcome to YARP - 8.分布式跟踪

哈哈哈,第一篇文章还说,只规划了8篇文章,写到配置功能的时候发现东西还是挺多的,还是拆分成小章节来说吧。目前成了10篇了—_—。写之前觉得配置功能应该没什么东西可讲,结果写着写着都想讲一嘴。然后就越写越多,大家看的时候可以选择性的跳过。

介绍

如果有同学不知道YARP是什么,YARP有哪些功能,或者对配置没有基本概念的同学请看前几篇文章,接下来这篇文章主要讲解YARP的配置功能的第三小章节:配置过滤器

配置过滤器(Configuration Filters)

YARProutes, clustersdestinations 的配置可以通过配置文件或其他配置提供者加载过来。

而配置过滤器可用于在验证应用原始输入(原始配置)之前对其进行修改。

加载配置 => 配置过滤器 => 验证配置 => 应用配置

过滤器可用于多种目的,例如:

  • 使用来自其他源(如部署环境)的数据补充配置字段
  • 应用系统默认值
  • 应用通用设置并强制实施策略
  • 替换占位符值 (下面的演示就是此场景)
  • 规范化和纠错

AddConfigFilter

配置过滤器使用 AddConfigFilter API 在依赖项注入系统中注册。可以添加任意数量的唯一过滤器,并将按添加顺序应用

using YARP.Configuration.ConfigFilter;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"))//加载配置
.AddConfigFilter<CustomConfigFilter>();//注册配置过滤器 var app = builder.Build(); // Configure the HTTP request pipeline.
app.MapReverseProxy(); app.Run();

首先我们创建一个CustomConfigFilter类并继承 IProxyConfigFilter 接口,然后我们去实现ConfigureClusterAsync方法和ConfigureRouteAsync方法。在这两个方法中对路由信息和集群信息进行拦截和自定义处理。

每次加载或重新加载配置时,都会为每个路由和集群调用过滤器。可以选择返回未修改的原始输入或修改后的副本。

此示例把地址替换为环境变量中的目标地址,并将路由的 Order 字段设置为 1

using System.Text.RegularExpressions;
using Yarp.ReverseProxy.Configuration; namespace YARP.Configuration.ConfigFilter; public class CustomConfigFilter : IProxyConfigFilter
{
// 用于匹配文本中的双花括号{{}}包围的单词(字母数字字符)
private readonly Regex _exp = new("\\{\\{(\\w+)\\}\\}"); // 集群的配置过滤器,将依次传递给每个集群,它应该按原样返回,或者 克隆并创建具有更新更改的新版本
// 此示例查看目标地址(destination addresses),任何形式{{key}}都将被匹配到,并用此key获取环境变量里对应的value
// 作为环境变量。当托管在Azure等中时,这很有用,因为它能够以简单的方式替换
public ValueTask<ClusterConfig> ConfigureClusterAsync(ClusterConfig origCluster, CancellationToken cancel)
{
// 每个集群都有一个 destination 字典,它是只读的,所以我们将用更新创建一个 destination 字典
var newDests = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase); foreach (var d in origCluster.Destinations)
{
var origAddress = d.Value.Address;
if (_exp.IsMatch(origAddress))
{
// 用先前定义的正则表达式_exp来匹配字符串,然后提取第一个匹配的结果的捕获组(Group)中索引为1的值: baidu。
var lookup = _exp.Matches(origAddress)[0].Groups[1].Value;
// 根据key(baidu):获取 value (https://www.baidu.com)
var newAddress = Environment.GetEnvironmentVariable(lookup); if (string.IsNullOrWhiteSpace(newAddress))
{
throw new ArgumentException($"Configuration Filter Error: Substitution for '{lookup}' in cluster '{d.Key}' not found as an environment variable.");
} // c# 9 "with" 语法: 克隆并初始化 record
var modifiedDest = d.Value with { Address = newAddress };
newDests.Add(d.Key, modifiedDest);
}
else
{
newDests.Add(d.Key, d.Value);
}
} return new ValueTask<ClusterConfig>(origCluster with { Destinations = newDests });
} public ValueTask<RouteConfig> ConfigureRouteAsync(RouteConfig route, ClusterConfig? cluster, CancellationToken cancel)
{
// Example: 不要让基于配置的路由优先于基于代码的路由。
// 数字越低,优先级越高。代码路由默认为0。
if (route.Order.HasValue && route.Order.Value < 1)
{
return new ValueTask<RouteConfig>(route with { Order = 1 });
} return new ValueTask<RouteConfig>(route);
}
}

配置如下:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1": {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"cluster1/destination1": {
// 以下值将由regex找到,并作为环境变量查找
"Address": "{{baidu}}"
}
}
}
}
}
}

launchSettings.json文件中环境变量设置如下:

"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"baidu": "https://www.baidu.com"
}

总结

配置过滤器就结束了,我们通过实现IProxyConfigFilter 接口对配置进行替换,配置文件中写的是占位符{{baidu}},用它当作key,环境变量里才是我们的真实地址,通过配置过滤器去拦截并处理替换成真实的地址。这对于敏感数据及其有用。代码示例已上传GitHub:YARP.Configuration.ConfigFilter

这篇文章就到这里,下一篇我们介绍 YARP 的负载均衡功能。

Welcome to YARP - 2.3 配置功能 - 配置过滤器(Configuration Filters)的更多相关文章

  1. WCF学习之旅—WCF4.0中的简化配置功能(十五)

    六 WCF4.0中的简化配置功能 WCF4.0为了简化服务配置,提供了默认的终结点.绑定和服务行为.也就是说,在开发WCF服务程序的时候,即使我们不提供显示的 服务终结点,WCF框架也能为我们的服务提 ...

  2. Rest Client(Rest接口调试工具,有保存功配置功能) chrome浏览器插件

    Rest Client(Rest接口调试工具,有保存功配置功能) chrome浏览器插件 下载地址 插件的操作很简单,下面是一些简单的实例. 1.安装 在谷歌应用商城搜索postman,如下图1-1所 ...

  3. qmake的配置功能(Configuration Features)

    Configuration Features qmake can be set up with extra configuration features that are specified in f ...

  4. Abp扩展之【配置功能】

    Abp的扩展功能非常强大,配合持久化可以很方便的配置系统.租户.用户的配置,关于ABP的配置请参考: http://www.cnblogs.com/farb/p/ABPSettingManagemen ...

  5. Apache运维中常用功能配置笔记梳理

    Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...

  6. mysql主从备份功能配置与測试

    在高訪问量服务环境下,单机配置mysql服务将无法满足频繁快速的数据读写操作. 一旦mysql出现故障造成数据丢失.无法恢复. 因此.在mysql服务上启用主从备份功能,支持读写分离技术.最靠可的是搭 ...

  7. [转载]eclipse的远程调试功能配置

    原文地址:eclipse的远程调试功能配置作者:我的 用途:web应用部署并运行于外部(区别于eclipse环境中启动的)应用服务器中,当出现问题时,可以使用eclipse工程的源代码进行跟踪调试. ...

  8. OpenvSwitch系列之五 网桥特性功能配置

    Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl命令使用 Open vSwit ...

  9. Nginx常用功能配置二

    Nginx常用功能配置二 Nginx location匹配设置 location作用:可以根据用户请求的URI来执行不同的应用,根据用户请求的网站的地址URL匹配. location语法: locat ...

  10. Nginx常用功能配置一

    Nginx常用功能配置 参数include配置 说明:如果日常工作中server标签存在太多,可以采用include配置模式,Nginx的主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目 ...

随机推荐

  1. 【scikit-learn基础】--『分类模型评估』之评估报告

    分类模型评估时,scikit-learn提供了混淆矩阵和分类报告是两个非常实用且常用的工具.它们为我们提供了详细的信息,帮助我们了解模型的优缺点,从而进一步优化模型. 这两个工具之所以单独出来介绍,是 ...

  2. .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(下)

    25 | 路由与终结点:如何规划好你的Web API 自定义约束实现了路由约束接口,它只有一个 Match 方法,这个方法传入了 Http 当前的 httpContext,route,routeKey ...

  3. scrapy框架使用:分布式、增量式

    scrapy框架的使用 前记:爬虫框架部分整理完成,后续慢慢完善, 声明: 1)仅作为个人学习,如有冒犯,告知速删! 2)不想误导,如有错误,不吝指教! 创建工程: scrapy startproje ...

  4. NC14700 追债之旅

    题目链接 题目 题目描述 小明现在要追讨一笔债务,已知有n座城市,每个城市都有编号,城市与城市之间存在道路相连(每条道路都是双向的),经过任意一条道路需要支付费用.小明一开始位于编号为1的城市,欠债人 ...

  5. NC24953 [USACO 2008 Jan G]Cell Phone Network

    题目链接 题目 题目描述 Farmer John has decided to give each of his cows a cell phone in hopes to encourage the ...

  6. STM32的时钟控制RCC和外设定时器

    STM32的RCC(Reset and Clock Control)时钟控制 stm32f103c8的时钟是72MHz, stm32f401ccu6的时钟是80M, 开发板板载两个晶振, 一个高速一个 ...

  7. oracle 游标变量ref cursor详解

    一 介绍      像游标cursor一样,游标变量ref cursor指向指定查询结果集当前行.游标变量显得更加灵活因为其声明并不绑定指定查询. 其主要运用于PLSQL函数或存储过程以及其他编程语言 ...

  8. React 组件之状态

    没有什么是不可能的,只是需要找到正确的方法. 1. 什么是状态? 状态就是组件内部特有数据的载体(组件数据挂载方式),改变数据页面就会刷新,由组件自己设置和更改,也就是说由组件自己产生.维护,使用状态 ...

  9. React 组件之样式

    无论你的梦想有多么高远,记住,一切皆有可能. 我们从前面的学习知道一个 React 组件不仅仅只包含 DOM 结构的,还应该样式和 Javascript 逻辑的.这里我们学习下如何构建 CSS 样式. ...

  10. 【ACM专项练习#03】打印图形、栈的合法性、链表操作、dp实例

    运营商活动 题目描述 小明每天的话费是1元,运营商做活动,手机每充值K元就可以获赠1元,一开始小明充值M元,问最多可以用多少天? 注意赠送的话费也可以参与到奖励规则中 输入 输入包括多个测试实例.每个 ...