YARP: 又一个反向代理
欢迎来到 YARP
的文档!YARP
是一个库,用于帮助创建高性能、可生产且高度可定制的反向代理服务器。现在它仍然在预览中,但是请通过 GitHub 仓库 提供您的反馈。
什么是 YARP ?
我们发现微软的一些内部团队要么为他们的服务构建一个反向代理,要么为构建一个代理询问 api
的技术,所以我们决定让他们一起开发一个 共同的解决方案 ---- 这个项目。这些项目中的每一个都在做一些稍微偏离常规的事情,这意味着它们不能很好地得到现有代理的服务,而且这些代理的定制需要高昂的成本和持续的维护考虑。
许多现有的代理都是为了支持 HTTP/1.1
而构建的,但是随着工作负载的变化包含了 gRPC
流量,它们需要 HTTP/2
的支持,这就需要一个非常复杂的实现。通过使用 YARP
,项目可以自定义路由和处理行为,而无需实现 http
协议。
使用 YAPR
YARP
是使用 ASP.NET
和 .NET
(.NET Core 3.1
和 .NET 5.0+
)的基础架构构建在 .NET
上的。
YARP
的主要不同之处在于,它被设计成可以通过 .NET
代码轻松定制和调整,以满足每个部署场景的特定需求。
最终,我们希望 YARP
以库、项目模板和单文件可执行文件的形式发布,为构建健壮、高性能的代理服务器提供多种选择。它的流水线和模块都经过了设计,这样您就可以根据需要定制功能。
例如,虽然 YARP
支持配置文件,但我们预计许多用户会希望基于他们自己的配置管理系统以编程方式管理配置。YARP
提供了一个配置 API
来支持进程内定制。
YAPR 反向代理
本文讨论的是 YARP - 反向代理
。
YARP
是一个库,用于帮助创建高性能、可生产且高度可定制的反向代理服务器。
那么什么是反向代理呢?
- 反向代理是放置在网络边缘的中间连接点。
- 它接收初始HTTP连接请求,并根据配置表现为实际端点。
- 反向代理充当应用程序和用户之间的网关。
YARP
可以支持从 appsettings.json
或代码中进行配置。在这篇文章中,将探索如何在一个空的 ASP.NET Core Web
应用程序中使用 YARP
。该应用程序将包括两个 ASP.NET Core MVC
应用程序(此处的两个应用程序就不创建了,改用两个目标 url
模拟)。首先,创建一个空的 web
应用程序。接下来你需要添加 YARP
包。
添加 yapr 的 nuget 包
在空的 asp.net core
应用中添加 yapr
的 nuget
包,可以用 dotnet cli
命令来做到这一点:
dotnet add package Yarp.ReverseProxy --version 1.0.0-preview.12.21451.3
配置并启用反向代理
.net core 3.1 or .net 5
可以配置Startup.cs
类来读取配置并启用反向代理。
public class Startup
{
public IConfiguration Configuration { get; set; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddReverseProxy()
.LoadFromConfig(Configuration.GetSection("ReverseProxy"));
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapReverseProxy();
});
}
}
.net 6
中省略了Startup.cs
类,可以在Program.cs
类中添加如下代码来读取配置并启用反向代理。
var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;
var env = builder.Environment;
var services = builder.Services;
#region services
// Add the reverse proxy to capability to the server
var proxyBuilder = services.AddReverseProxy();
// Initialize the reverse proxy from the "ReverseProxy" section of configuration
proxyBuilder.LoadFromConfig(config.GetSection("ReverseProxy"));
#endregion
var app = builder.Build();
#region app
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
// Enable endpoint routing, required for the reverse proxy
app.UseRouting();
// Register the reverse proxy routes
app.UseEndpoints(endpoints =>
{
endpoints.MapReverseProxy();
});
app.Run();
#endregion
添加 appsettings.json
配置文件
在 ConfigureServices
方法中,添加了反向代理中间件,配置从 appsettings.json
文件中读取。并映射 Configure
方法,路由到反向代理配置。接下来需要修改配置,可以通过编辑 appsettings.json
文件来完成。下面是反向代理配置。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"route1": {
"ClusterId": "cluster1",
"Match": {
"Path": "{**catch-all}"
}
}
},
"Clusters": {
"cluster1": {
"LoadBalancingPolicy": "RoundRobin",
"Destinations": {
"cluster1/destination1": {
"Address": "https://www.jd.com/"
},
"cluster1/destination2": {
"Address": "https://www.taobao.com/"
},
"cluster1/destination3": {
"Address": "https://www.suning.com/"
}
}
}
}
}
}
这个配置主要有两个元素—— Routes
和 Clusters
:
Routes
中配置终结点路由和url
。Match
元素为所有路由配置代理。RouteId
是路由的唯一名称。ClusterId
用于标识后端应用服务器或url
。
在 Clusters
中,配置了两个应用程序 url
。可以是同一个应用程序运行在不同的端口上,也可以是不同的应用程序运行在各自的环境中。
现在可以运行代理应用程序和其他 web
应用程序了。其他的 web
应用程序,你可以在不同的端口运行以下命令:
dotnet run --url="https://localhost:xxxxx"
上面我们已经准备好代理应用的程序,接下来我们运行看下效果,是否符合预期目标:
curl http://localhost:5198
执行上面访问命令,得到如下结果,符合预期目标。
YARP 负载均衡配置策略
First
--- 选择第一个目标,不考虑负载。这对于双目标故障转移系统非常有用。Random
--- 随机选择一个目标。PowerOfTwoChoices
(默认) --- 选择两个随机的目标,然后从中选择一个更少请求的目标。这避免了LeastRequests
的开销,也避免了Random
选择繁忙目的地的最坏情况。RoundRobin
--- 通过顺序循环选择一个目标。LeastRequests
--- 所有目标中选择分配请求最少的目标。这需要检查所有目标。
要配置任何其他负载均衡策略,可以在 cluster1
中添加 LoadBalancingPolicy
以上策略即可。YARP
默认不配置的情况,使用的是 PowerOfTwoChoices
策略。
YARP
还通过检查目标应用程序的运行状况并基于路由请求来支持流量路由。如果你正在使用 ASP.NET Core
应用程序,可以启用 ASP.NET Core
运行状况检查选项。YARP
带来了很多新特性和改进。
查看文档和主页(https://microsoft.github.io/reverse-proxy/?WT.mc_id=AZ-MVP-5002040),了解现有特性和如何使用它的更多细节。
参考文章 : https://dotnetthoughts.net/getting-started-with-microsoft-yarp/
YARP 文档: https://microsoft.github.io/reverse-proxy/?WT.mc_id=AZ-MVP-5002040