
大家好,我是民工哥!
提到反向代理软件,大家肯定第一时间想到是:Nginx,没错,Nginx确实是一款非常优秀的反向代理软件,很多大厂都在使用,比如:微软。
不过,目前微软用它取代了 Nginx ,使得吞吐量提升了百分之八十!

2021 年,微软将应用服务前端队列转换为 Kestrel + YARP。目前这个应用程序每天处理 160B+ 个 HTTP 请求,这是微软内部自己开发的一个应用程序,通过使用 .NET 的基础架构构建在 .NET 上的。

所以,今天我们一起来学习一下 YARP。

Yarp(Yet Another Reverse Proxy)是一个反向代理工具包,用于使用ASP.NET和.NET基础设施并在.NET中构建快速代理服务器。Yarp是一个轻量级的.NET反向代理,支持HTTP和HTTPS协议,可以将请求转发到其他服务器上。

Yarp 基于.Net架构,因此可以在Windows和Linux上应用。Yarp最大的特点是可定制化,可以根据特定场景开发出需要的定制代理通道。你可以根据应用程序的特定需求进行自定义,使用规则来转发请求,并在转发请求时添加或修改HTTP头。
YARP具有许多主要特点,包括:
此外,YARP还具有一些功能,如反向代理、负载均衡、限流(仅在使用.NET 7.0或更高版本时可用)、身份验证和授权、压缩、缓存、健康检查以及分布式跟踪等。
YARP 2.0.0 支持 ASP.NET Core 6.0 及更高版本。可以从 https://dotnet.microsoft.com/download/dotnet/ 下载 .NET SDK。
所以安装环境需要预先部署.Net环境,可以使用下面的命令检查:
dotnet --version
然后使用命令行创建一个空的 ASP.NET Core 项目
dotnet new web -n MyProxy -f net6.0
然后使用 nuget 管理工具手动添加包 Yarp.ReverseProxy,也可以使用命令模式添加
Install-Package Yarp.ReverseProxy
在Program.cs文件中注册Yarp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
配置 appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"Destinations": {
"microsoft": {
"Address": "https://docs.microsoft.com/zh-cn/" },
"github":{
"Address": "https://github.com/"
}
}
}
}
}
配置完成后,运行项目即可,访问该站点将随机反向代理到微软官网和github,如下效果:

更多操作及配置过程可参考:https://microsoft.github.io/reverse-proxy/articles/getting-started.html
两者都具有相同的功能,在相关的配置上肯定是可相互替代的,接下来演示这部分的配置内容。
YARP提供了类似于Nginx的路由匹配功能。
#Nginx
/webapp
#YRAP
"route1" : {
"ClusterId": "cluster1",
"Match": {
"Path": "/webapp/{**catch-all}"
}
YARP 具有内置的负载均衡功能,可以根据请求的属性(如URL路径、请求头、客户端IP等)将其转发到多个后端服务器。
#Nginx 配置负载均衡
upstream backend {
server localhost:9002;
server localhost:9003;
}
server {
listen 8080;
server_name localhost;
location / {
# backend 就是服务器组的名称
proxy_pass http://backend/;
}
}
#YARP配置负载均衡
"Destinations": {
"APP1": {
"Address": "https://10.0.0.1:9999"
},
"APP2":{
"Address": "https://10.0.0.1:8888"
}
}
官方给出的实例:

Nginx 中地址重写直接使用 rewrite
server {
location / {
limit_conn myip 10;
limit_conn myServerName 100;
rewrite / http://www.mingongge.com permanent;
}
Yarp 在 route中增加配置
"Transforms": [
{ "PathRemovePrefix": "/OMS" }
]
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
YARP 默认 X-Forwarded-For,需要配置成 X-Forwarded-Proto,X-Forwarded-Host 可在 Transforms 中进行修改。
Nginx 超时配置
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
Yarp 超时配置
"HttpRequest": {
"ActivityTimeout": "<timespan>",#格式"ActivityTimeout": "00:00:30"
"Version": "<string>",
"VersionPolicy": ["RequestVersionOrLower", "RequestVersionOrHigher", "RequestVersionExact"],
"AllowResponseBuffering": "<bool>"
}
YARP 给微软 Azure 应用服务带来巨大的提升:
由微软 .NET 核心团队开发的 Kestrel + YARP 这个创新技术还是非常有价值的,值得大家尝试引到自己的开发项目来。