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 是一个提供基于 .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 加密
- 请求/响应标头和内容有效负载的大小
可以在 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