.NET 6 之 YARP 初体验

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 类来读取配置并启用反向代理。
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 类,可以在 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

おすすめ

転載: blog.csdn.net/ChaITSimpleLove/article/details/120487510