.NET 6 之 YARP 初体验

简介: YARP —— 又一个反向代理欢迎来到 YARP 的文档!YARP 是一个库,用于帮助创建高性能、可生产且高度可定制的反向代理服务器。现在它仍然在预览中,但是请通过 GitHub 仓库 提供您的反馈。什么是 YARP ? 我们发现微软的一些内部团队要么为他们的服务构建一个反向代理,要么为构建一个代理询问 API 的技术...

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连接请求,并根据配置表现为实际端点。
  • 反向代理充当应用程序和用户之间的网关。

image.png

YARP 可以支持从 appsettings.json 或代码中进行配置。在这篇文章中,将探索如何在一个空的 ASP.NET Core Web 应用程序中使用 YARP。该应用程序将包括两个 ASP.NET Core MVC 应用程序(此处的两个应用程序就不创建了,改用两个目标 url 模拟)。首先,创建一个空的 web 应用程序。接下来你需要添加 YARP 包。

添加 yapr 的 nuget 包

在空的 asp.net core 应用中添加 yaprnuget 包,可以用 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/"
          }
        }
      }
    }
  }
}

这个配置主要有两个元素—— RoutesClusters

  • Routes 中配置终结点路由和 url
  • Match 元素为所有路由配置代理。
  • RouteId 是路由的唯一名称。
  • ClusterId 用于标识后端应用服务器或 url

Clusters 中,配置了两个应用程序 url。可以是同一个应用程序运行在不同的端口上,也可以是不同的应用程序运行在各自的环境中。

现在可以运行代理应用程序和其他 web 应用程序了。其他的 web 应用程序,你可以在不同的端口运行以下命令:

dotnet run --url="https://localhost:xxxxx"

上面我们已经准备好代理应用的程序,接下来我们运行看下效果,是否符合预期目标:

curl http://localhost:5198

执行上面访问命令,得到如下结果,符合预期目标。

image.png

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
目录
相关文章
|
开发框架 IDE .NET
.NET 6 之 ABP vNext 初体验
本文将介绍在 .net6 平台的 asp.net core webapi 框架中,如何使用 abp vnext 框架进行模块化开发,重在思想理解。
1107 1
.NET 6 之 ABP vNext 初体验
|
存储 开发框架 JavaScript
『SignalR』.NET使用 SignalR 进行实时通信初体验
📣读完这篇文章里你能收获到 - 你将对SignalR有了初步的认识及体会 - 对于哪些场景适用SignalR以及如何接入使用 - SignalR的代码入门级Demo实际案例
634 0
『SignalR』.NET使用 SignalR 进行实时通信初体验
|
开发框架 负载均衡 网络协议
.NET WebSocket 核心原理初体验
本文将利用WebSockets(SignalR的一部分)搭建一个可双向通信的ASP.NETCore5应用。
.NET WebSocket 核心原理初体验
|
负载均衡 Cloud Native Java
.NET gRPC核心功能初体验
gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。
.NET gRPC核心功能初体验
|
存储 NoSQL Cloud Native
.NET 5 with Dapr 初体验
分布式应用运行时Dapr目前已经发布了1.1.0版本,阿里云也在积极地为Dapr贡献代码和落地实践。作为一名开发者,自然也想玩一玩,看看Dapr带来的新“视”界到底是怎么样的。
1483 0
.NET 5 with Dapr 初体验
|
SQL .NET 数据库
.net core 2.1-----Sql Server数据库初体验
刚开始接触asp.net core,在学习的过程中遇到了一些小问题,在这里记录一下! 在我们项目的开发过程中,肯定会和数据库打交道,所以我尝试了一下用asp.net core链接数据库,并读取表中的数据(当然你必须保证有能访问的sql server数据库)! 首先,新建项目:ASP.
1313 0