目录

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. Java容器及其常用方法汇总

    1 概述 Java Collections 框架中包含了大量的接口及其实现类和操作它们的算法,主要包括列表(List).集合(Set).映射(Map),如下: 接口 实现类 数据结构 初始容量 加载因 ...

  2. 使用多层RNN-LSTM网络实现MNIST数据集分类及常见坑汇总

    1 前言 循环神经网络(Recurrent Neural Network, RNN)又称递归神经网络,出现于20世纪80年代,其雏形见于美国物理学家J.J.Hopfield于1982年提出的可作联想存 ...

  3. 我的小程序之旅十:微信公众号token验证失败

    为了更好的运营公众号,微信官方支持用户自定义实现公众号功能,这里第一步就是配置服务器回调域名,如下图: 如果是SpringBoot项目,我们会写一个如下的Controller类 import lomb ...

  4. C++ 多线程的错误和如何避免(13)

    在 async 任务中抛出的异常会被 std::future::get() 触发 #include <future> #include <iostream> int main( ...

  5. Java缓存框架整理

    Spring Cache 为基于Spring框架的应用提供了一套完整的缓存API抽象,具体的缓存实现可以对接如Ehcache,Redis等. https://docs.spring.io/spring ...

  6. Oracle设置日志参数-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

    要实现两个数据库之间的实时同步,需要给Oracle设置参数 ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 执行了12小时,等待数据库中的其它事务都提交以后才 ...

  7. Could not resolve type alias 'com.github.mybatis.helper.page.PageSqlInterceptor'.

    报错信息  Could not resolve type alias 'com.github.mybatis.helper.page.PageSqlInterceptor'. Cause: java. ...

  8. Java纯手打web服务器(二)

    概要:这里对上一篇中的访问资源进行改进,将访问servlet和静态资源进行区分. 主要不同的地方是加入了两种分析器 servlet分析器 if (request.getUri().startsWith ...

  9. 【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误

    问题描述 PHP应用突然遇见了500 The page cannot be displayed because an internal server error has occurred.错误,但是如 ...

  10. 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

    问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...