YARP 1.0 曾经公布了,当初能够从 NuGet 下载。YARP(Yet Another Reverse Proxy)是应用 .NET 构建的高度可定制的反向代理。YARP 与其余反向代理的最大区别在于它是如何构建和打包的——YARP 作为库和示例提供,展现了如何创立依据特定场景的需要定制的代理。
什么是反向代理?
反向代理用于侦听传入的 HTTP 申请并依据申请的内容将申请转发到适当的服务器。与在第 4 层 (TCP/IP) 起作用的典型防火墙 / 路由器不同,反向代理通常在第 7 层工作,因而它们了解 http 并基于 http 字段工作。
当 YARP 代理申请时,它会解决来自客户端的 HTTP 连贯,而后创立本人到指标服务器的连贯,单方都能够从连接池中受害。
应用反向代理有很多长处:
- 它充当站点或一组服务的公共端点,使裸露的 url 空间独立于理论实现
- 将调用转发到后端服务器以执行理论工作,均衡它们之间的负载
- 能够从后端服务器卸载工作,例如 TLS 加密、Auth 2、压缩、缓存
什么是 YARP
YARP 是一个提供基于 .NET 的开源反向代理服务器的我的项目。它始于大概两年前,过后咱们留神到微软团队提出的一种问题模式,这些团队要么为他们的服务构建反向代理,要么始终在询问构建一个反向代理的 API 和技术。咱们决定让他们一起钻研一个通用的解决方案,这就是 YARP。
YARP 是一个反向代理工具包,用于应用 ASP.NET 和 .NET 的基础设施并在 .NET 中构建疾速代理服务器。YARP 的要害区别在于它的设计易于定制和调整,以匹配每个部署场景的特定需要。
咱们在与创立 Microsoft 服务的团队交谈时发现,每项服务都稍微偏离惯例,他们都在构建本人的解决方案,或者尝试自定义第三方代理。尽管他们有 HTTP/1.1 的解决方案,但他们须要 HTTP/2——通常用于 gRPC,而 HTTP/2 应用二进制帧格局,实现起来要简单得多。YARP 使开发人员可能齐全管制,同时利用通过验证的 ASP.NET Core 和 .NET 功能集,以及 C#(或其余 .NET 语言)的生产力。
YARP 插入 ASP .NET 作为解决传入申请的中间件,YARP 提供了两个次要的应用和定制门路:
- 作为一个全功能的代理——YARP 应用配置来定义一组基于 URL 模式的路由,这些路由映射到指标服务器的集群,集群中的每个指标都应该可能解决集群映射到的路由的申请。指标列表依据会话亲和性和服务器运行状况进行过滤,而后应用负载平衡算法在残余指标之间进行抉择。其中的每个局部都能够通过配置进行自定义,客户能够依据须要增加额定的模块或替换库存模块。配置零碎是可扩大的,因而能够从诸如 Service Fabric 之类的源中提取路由和指标信息。
- 或者,对于高度自定义的环境,能够间接调用 YARP 申请转发器,绕过路由、负载平衡模块等。例如,这就是 Azure 应用服务应用 YARP 将申请路由到特定实例的形式,实例所在的地位按需旋转。
这些甚至能够在同一个过程中一起应用,依据路由在它们之间切换。
YARP 入门
与作为能够扩大的可执行文件提供的其余代理不同,YARP 反转了模型。您应用调用 YARP 的模板创立代理,这样能够更轻松地将您本人的自定义和性能增加到 YARP。
以下示例基于 .NET 6 的新简化模板。示例实用于 .NET Core 3.1 和 .NET 5。
- 如果尚未从 https://dotnet.microsoft.com/… 装置,请装置 .NET 6
- 应用创立一个新的 Web 我的项目
dotnet new web --name MyYarpProxy
-
增加对 YARP nuget 包的援用:
dotnet add package MyYarpProxy Yarp.ReverseProxy
- 将 program.cs 中的代码替换为:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddReverseProxy()
.LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));
var app = builder.Build();
app.MapReverseProxy();
app.Run();
- 将 appsettings.json 中的配置文件替换为:
{
"Urls": "http://localhost:5000;https://localhost:5001",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ReverseProxy": {
"Routes": {
"minimumroute": {
"ClusterId": "minimumcluster",
"Match": {"Path": "{**catch-all}"
}
}
},
"Clusters": {
"minimumcluster": {
"Destinations": {
"httpbin.org": {"Address": "https://httpbin.org/"}
}
}
}
}
}
这将创立一个代理来监听 http://localhost:5000 和 https://localhost:5001 并将任何申请路由到 https://httpbin.org(一个用于 http 调试的有用站点),通过配置增加。
YARP 1.0 中有什么
此 YARP 1.0 版本包含以下性能:
配置
- YARP 配置定义了路由和目的地。它能够通过以下形式提供:
- 动态配置文件,具备动静更新的文件更改检测
- 与其余起源接口的编程配置可扩展性
- 对于超大规模托管,路由能够是齐全动静的,由利用程序代码确定,并由 YARP 依据每个申请进行解决
路由和入站连贯
- YARP 能够基于 SNI/Host 的多个站点和路由
- 路由能够基于申请 URL 和标头值
- 被动和被动健康检查以确认目的地的可用性,并过滤掉不良申请
- Session Affinity 会将后续申请路由到同一目的地基于申请的 URL
- 用于跨目的地负载平衡的多种算法
- 特定路由的身份验证、受权和 CORS
代理和出站连贯
- 传入的申请 URL 能够在传递到目的地之前进行转换
- 能够转换申请和响应标头
- 能够转换 Http 办法(例如 POST 到 PUT)
- 到目的地的出站 http 连贯是可配置的
- 代理增加与申请转发相干的规范标头
- gRPC 和 Web 套接字流量,包含流式传输
诊断
- 监控性能的指标
- 记录以具体跟踪每个申请
个别的
- 代理具备云规模性能
- 文档
- 易于扩大——客户能够增加中间件来自定义代理性能,例如路由、标头操作
- 反对 .NET Core 3.1、.NET 5 和 .NET 6
性能
代理的性能将取决于许多因素:
- 客户端对代理应用的 http 版本
- 指标代理应用的 http 版本
- 是否应用 TLS 加密
- 申请 / 响应标头和内容无效负载的大小
咱们有一组每天针对 YARP 和其余代理服务器运行的基准。这是在实验室中应用为测量 TechEmpower 基准而创立的“黄水晶”硬件定义进行测量的。后果应用 PowerBI 仪表板出现,可用于与其余代理进行比拟。例如,将 YARP 和 Envoy 的(传入传出协定)http-http1.1 和 https-https1.1 与 21 年 10 月的后果进行比拟,如下所示:
能够在 https://aka.ms/aspnet/benchmarks 找到仪表板。在那里,页面底部是一个用于抉择页面的小部件。代理后果在第 16 页。
提醒 :点击文本“1 of 21”将弹出一个页面菜单,其中“代理”能够间接抉择。
开源
YARP 正在作为一个开源我的项目进行开发和交付。它托管在 https://github.com/microsoft/… 的 github 上。咱们感激大家的奉献、问题和探讨。
反对
YARP 反对由产品团队(从事 YARP 工作的工程师)提供,该团队由 ASP.NET 和外围库网络团队的成员组成。咱们不提供 24/7 全天候反对或“随身寻呼机”,但因为咱们的团队成员位于布拉格和雷德蒙德,因而咱们通常具备良好的时区覆盖率。应应用问题模板在 github 中报告谬误,通常会在 24 小时内回复。如果您发现平安问题,咱们会要求您通过 Microsoft 平安响应核心 (MSRC) 进行报告。
咱们将针对安全性或其余重大问题提供 1.0 服务。将来版本将思考新性能。咱们预计将在将来几个月内开始公布下一个版本的预览版本。
下一步是什么
反向代理的工作将持续。咱们在列表中为下一个版本工作的我的项目包含:
- 反对 HTTP/3 – 初步测试表明它大部分都能够工作,但咱们心愿在 ARP #1208 中有一个牢靠的实现
- 更多性能优化——咱们将再次推动性能,并应用 YARP 将额定的性能特引入入.NET
- 应用 LLHTTP 提供对出站连贯的更多管制和更无效的标头解决。LLHTTP 是一个试验,旨在开发比 HttpClient 更低级别的 HTTP API,以更好地管制 HTTP 申请的收回和解决形式。
- 反对 Service Fabric – YARP 的晚期预览版包含一个用于 Service Fabric 集成的模块。这对于应用 Service Fabric 的站点典型的大规模站点部署来说是不够的。咱们正在与 SF 团队成员单干,施行更弱小和可扩大的解决方案,用于依据 SF 数据动静配置代理 #257
- @jkotalik 为 Kubernetes 集成编写了一个原型实现。从事 YARP 工作的 Microsoft 团队成员不是 k8s 部署方面的专家,因而咱们正在与社区成员单干以进一步开发此集成。#200