.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
目录
相关文章
|
3月前
|
前端开发 API
.NET7之MiniAPI(特别篇):.NET7 Preview3
.NET7之MiniAPI(特别篇):.NET7 Preview3
46 0
|
4月前
|
开发框架 安全 C#
掌握.NET基础知识(一)
掌握.NET基础知识(一)
51 0
|
存储 开发工具
【.NET】快速入门
【.NET】快速入门
87 0
【.NET】快速入门
|
存储 XML SQL
.NET、C#基础知识
.NET、C#基础知识
112 0
|
存储 开发框架 安全
.NET 基础知识
修饰符有什么作用呢?它是什么东西呢?
116 0
.NET 基础知识
|
XML 开发工具 数据格式
Microsoft .NET:Microsoft .NET之.net4.5.1简介、安装、使用方法之详细攻略
Microsoft .NET:Microsoft .NET之.net4.5.1简介、安装、使用方法之详细攻略
|
数据库 Windows
一起谈.NET技术,.NET 打包入门
  1、在这个安装包制作的过程中,所用到的一些图片或者文件,如:快捷键图片,安装步骤中每个图形界面的背景图片等都要事先在[应用程序文件夹]中事先添加好这些图片,即在安装项目中添加这些图片,文件好像是解决方案下debug下的所有文件都拷贝,如exe、config、rpt还有图片等   2、安装包中的那个Install里面的方法的执行时间是在:所以的文件都安装好了后再执行其中的号码。
820 0
|
XML C# 数据格式
一起谈.NET技术,C#编程笔记(一)
前段时间,帮朋友用C#做了一个小玩意儿,在开发过程中,发现很多用的着的东西,在网上都没有很好的解决方案,前前后后折腾了近一个月,总算是基本上完成了,在此整理下,权作以后再用到时复习之用。       这个东西有点像星座性格测试那种的,只不过是要C/S的,安装到客户端上,所以做起来限制比较多。
652 0
一起谈.NET技术,.Net Framework源代码中的模式——前言
  随着Visual Studio 2008的发布,微软根据MS-RL协议向开发人员提供了.NET Framework的源代码,包括基础类库 (BCL)、 ASP.NET、 WinForms和WPF等代码。
872 0

热门文章

最新文章