YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度可定制的反向代理

点击上方蓝字

关注我们

(本文阅读时间:16分钟)

YARP 1.0已经发布了,现在可以从 NuGet 下载。YARP(Yet Another Reverse Proxy)是使用 .NET 构建的高度可定制的反向代理。YARP 与其他反向代理的最大区别在于它是如何构建和打包的——YARP 作为库和示例提供,展示了如何创建根据特定场景的需求定制的代理。

94485e74a235a7ebfa5184b2666eabb3.png

什么是反向代理?

c8311c975f70aa22eaa3c8d12232ec71.png

反向代理用于侦听传入的 HTTP 请求并根据请求的内容将请求转发到适当的服务器。与在第 4 层 (TCP/IP) 起作用的典型防火墙/路由器不同,反向代理通常在第 7 层工作,因此它们理解 http 并基于 http 字段工作。

当 YARP 代理请求时,它会处理来自客户端的 HTTP 连接,然后创建自己到目标服务器的连接,双方都可以从连接池中受益。

1c7429def5ea19b624ec46d48e182dbe.png

使用反向代理有很多优点:

  • 它充当站点或一组服务的公共端点,使暴露的 url 空间独立于实际实现

  • 将调用转发到后端服务器以执行实际工作,平衡它们之间的负载

  • 可以从后端服务器卸载工作,例如 TLS 加密、Auth 2、压缩、缓存

8bba34c40e7d2bacb11d27da1d794bd3.png

什么是 YARP

9ecfe153588937110b59b9457b83ef42.png

YARP 是一个提供基于 .NET 的开源反向代理服务器的项目。它始于大约两年前,当时我们注意到微软团队提出的一种问题模式,这些团队要么为他们的服务构建反向代理,要么一直在询问构建一个反向代理的 API 和技术。我们决定让他们一起研究一个通用的解决方案,这就是 YARP。

  • YARP

    https://github.com/microsoft/reverse-proxy

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 将请求路由到特定实例的方式,实例所在的位置按需旋转。

这些甚至可以在同一个进程中一起使用,根据路由在它们之间切换。

0cb7f7d125ac725ec51cd5d5887faede.png

YARP 入门

e4fd72e31096c4a3f4a56d2aa6f22640.png

与作为可以扩展的可执行文件提供的其他代理不同,YARP 反转了模型。您使用调用 YARP 的模板创建代理,这样可以更轻松地将您自己的自定义和功能添加到 YARP。

以下示例基于 .NET 6 的新简化模板。示例适用于 .NET Core 3.1 和 .NET 5

1.    如果尚未从 https://dotnet.microsoft.com/download 安装,请安装 .NET 6

2.    使用创建一个新的 Web 项目

dotnet new web --name MyYarpProxy

3.    添加对 YARP nuget 包的引用:

dotnet add package MyYarpProxy Yarp.ReverseProxy

4.    将 program.cs 中的代码替换为:

var builder = WebApplication.CreateBuilder(args);builder.Services.AddReverseProxy().LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));var app = builder.Build();app.MapReverseProxy();app.Run();

5.    将 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 调试的有用站点),通过配置添加。

  • 适用示例

    https://github.com/microsoft/reverse-proxy/tree/main/samples/BasicYarpSample

  • 通过配置添加

    https://microsoft.github.io/reverse-proxy/articles/config-files.html

19912f2983698fb7cbee8e8e52dbc68c.png

YARP 1.0中有什么

10ffb45f348e21cea66817f652b86750.png

此 YARP 1.0 版本包括以下功能:

配置

  • YARP 配置定义了路由和目的地。它可以通过以下方式提供:

    • 静态配置文件,具有动态更新的文件更改检测

    • 与其他来源接口的编程配置可扩展性

  • 对于超大规模托管,路由可以是完全动态的,由应用程序代码确定,并由 YARP 根据每个请求进行处理

  • 静态配置文件

    https://microsoft.github.io/reverseproxy/articles/config-files.html

  • 编程配置可扩展

    https://microsoft.github.io/reverse-proxy/articles/config-providers.html

  • 应用程序代码

    https://microsoft.github.io/reverse-proxy/articles/direct-forwarding.html

路由和入站连接

  • YARP 可以基于SNI/Host的多个站点和路由

  • 路由可以基于请求 URL 和标头值

  • 主动和被动健康检查以确认目的地的可用性,并过滤掉不良请求

  • Session Affinity 会将后续请求路由到同一目的地基于请求的URL

  • 用于跨目的地负载平衡的多种算法

  • 特定路由的身份验证、授权和 CORS

  • 标头值

    https://microsoft.github.io/reverse-proxy/articles/header-routing.html

  • 主动和被动健康检查

    https://microsoft.github.io/reverse-proxy/articles/dests-health-checks.html#active-health-check

  • Session Affinity

    https://microsoft.github.io/reverse-proxy/articles/session-affinity.html

  • 负载平衡

    https://microsoft.github.io/reverse-proxy/articles/load-balancing.html

  • 特定路由的身份验证、授权

    https://microsoft.github.io/reverse-proxy/articles/authn-authz.html

代理和出站连接

  • 传入的请求 URL 可以在传递到目的地之前进行转换

  • 可以转换请求和响应标头

  • 可以转换 Http 方法(例如 POST 到 PUT)

  • 到目的地的出站 http 连接是可配置的

  • 代理添加与请求转发相关的标准标头

  • gRPC 和 Web 套接字流量,包括流式传输

  • 转换

    https://microsoft.github.io/reverse-proxy/articles/transforms.html#request-transforms

  • 请求

    https://microsoft.github.io/reverse-proxy/articles/transforms.html#requestheaderscopy

  • 响应标头

    https://microsoft.github.io/reverse-proxy/articles/transforms.html#response-and-response-trailer

  • 转换Http方法

    https://microsoft.github.io/reverse-proxy/articles/transforms.html#httpmethodchang

  • 到目的地的出站 http 连接

    https://microsoft.github.io/reverse-proxy/articles/http-client-config.htm

  • 添加相关的标准标头

    https://microsoft.github.io/reverse-proxy/articles/transforms.html#defaults

  • gRPC

    https://microsoft.github.io/reverse-proxy/articles/grpc.html

诊断

  • 监控性能的指标

  • 记录以详细跟踪每个请求

  • 指标

    https://github.com/microsoft/reverseproxy/tree/main/samples/ReverseProxy.Metrics.Sample

一般的

  • 代理具有云规模性能

  • 文档

  • 易于扩展——客户可以添加中间件来自定义代理功能,例如路由、标头操作

  • 支持 .NET Core 3.1、.NET 5 和 .NET 6

  • 文档

    https://microsoft.github.io/reverse-proxy/articles/index.htm

  • 中间件

    https://microsoft.github.io/reverse-proxy/articles/middleware.html

  • 支持 .NET Core 3.1、.NET 5 和 .NET 6

    https://microsoft.github.io/reverse-proxy/articles/runtimes.html

性能

代理的性能将取决于许多因素:

  • 客户端对代理使用的 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://microsoft.github.io/reverse-proxy/articles/index.html

  • 黄水晶

    https://www.techempower.com/benchmarks/#section=environment 

4141abe471732ce347ce3c5ccbd72db9.png

开源

a0284b8612a45054637f03f1c08aad0d.png

YARP 正在作为一个开源项目进行开发和交付。它托管在https://github.com/microsoft/reverse-proxy 的 github 上。我们感谢大家的贡献、问题和讨论。

56ca8af4f2fcb3f226ba3f352028dccb.png

支持

bbd68836ab5e9d6800c0ca965580a511.png

YARP 支持由产品团队(从事 YARP 工作的工程师)提供,该团队由 ASP.NET 和核心库网络团队的成员组成。我们不提供 24/7 全天候支持或“随身寻呼机”,但由于我们的团队成员位于布拉格和雷德蒙德,因此我们通常具有良好的时区覆盖率。应使用问题模板在 github 中报告错误,通常会在 24 小时内回复。如果您发现安全问题,我们会要求您通过 Microsoft 安全响应中心 (MSRC) 进行报告。

我们将针对安全性或其他重大问题提供 1.0 服务。未来版本将考虑新功能。我们预计将在未来几个月内开始发布下一个版本的预览版本。

  • 模板https://github.com/loginreturn_to=https%3A%2F%2Fgithub.com%2Fmicrosoft%2Freverseproxy%2Fissues%2Fnew%3Fassignees%3D%26labels%3DType%253A%2BBug%26template%3Dbug.md

  • MSRC

    https://github.com/microsoft/reverseproxy/blob/main/SECURITY.md

下一步是什么

57f272ce84dce96ce0af9401e0af92cc.png

d8e324b477cfbf5383abf65bf57247ce.gif

反向代理的工作将继续。我们在列表中为下一个版本工作的项目包括:

  • 支持 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

  • #1208中有一个可靠的实现

    https://github.com/microsoft/reverse-proxy/issues/1208

  • LLHTTP

    https://github.com/dotnet/runtimelab/tree/feature/LLHTTP2

  • #257

    https://github.com/microsoft/reverse-proxy/pull/257

  • #200

    https://github.com/microsoft/reverse-proxy/issues/200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电影院里为何有散落的青瓜?

1 摄像头:你套个袋子我就认不出来了吗?▼2 路边惊现大熊猫!(素材来源网络,侵删)▼3 好一个驼小姐(via.豆瓣社死小组满杯草莓)▼4 学弟的理解也不是无迹可寻▼5 台湾人过生日的方…

java中List、Map、Set、Collection、Stack、Queue等的使用

java中这几个东西是比较常用的,虽然我用的不多,也正是因为用的不多,所以我一直搞不清楚他们之间的具体用法以及相互之间的关系,现在特单独作为一个东西来总结一下。 本文参考一下资料: 1.《java编程思想》一书第11章 2…

开发文档模板_需求文档模板一堆什么样的适合你呢?

产品经理的日常中用的最多的是产品需求文档,这个文档应该可以说是产品经理将需求落到是明面上的一步。我们的文档需要给相关的人员进行共同的看,不然文档就没有存在的意义了,文档不只是简单的线框图和一些自己也看不明白的词汇。实际中很少开…

Briefly unavailable for scheduled maintenance message after doing automatic upgrade

为什么80%的码农都做不了架构师?>>> 今天突然不能打开wordpress,报了“Briefly unavailable for scheduled maintenance message after doing automatic upgrade” 这个错误,一下懵逼了。 Google之后,发现是wordpress…

搞IT的技术人员为什么会如此苦逼

http://www.cnblogs.com/springmvc-hibernate/archive/2012/05/10/2493733.html —————————————————————————————————————————————————————— 为什么苦逼? 原因一大堆,对于外部的因数,我…

为什么越来越多的开发者选择使用Spring Boot

Web应用开发背景 使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架,库以及整个生态系统。经过这么长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这…

【Blog.Core开源】快速预览Admin界面效果

( 半盏屠苏犹未举,灯前小草写桃符 )书接上文《【Blog.Core开源】开发插件,给Swagger加权》,在上篇文章中,我们给项目的接口文档增加了一个控制界面,可以输入用户名密码,这样也算是简单的一个加密控制了&…

视图添加字段_Odoo开发教程2-为模型添加字段

开启开发者模式后,我们可通过菜单 Settings > Technical > Database Structure > Models来查看模型的定义。这时搜索 res.partner(未安装其它应用的情况下第一个即是),对应的模型描述为 Contact。点击打开表单视图,这时就可以看到 p…

linux之通过htop操作进程使用总结

1、htop介绍 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器,htop比top更加人性化,有具体界面可以操作,读者可以先使用top看下效果,然后再安装htop. 2、安装htop 输入下面命令 sudo apt-get install htop 3、效…

6大奖项!首届 .NET 黑客松大赛圆满收官!

.NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展。峰会由来自北京、上海、苏州、深圳、武汉、广州、青岛、烟台、杭州等各地区的 .NET 技术社区共同发起举办,由微…

看完这套书才发现,以前的四大名著都白看了!

▲ 点击查看四大名著是我国最经典的古典文学作品,代表着传统文化在小说创作方面的最高成就。同时,也是必学书、必读书、必考书。从小了说,在语文学习上,全国统一的语文教材里,五年级下册已出现了四大名著的章节。作为整…

在Windows Live Writer中插入C# code

平时都是用Windows Live Writer写博客,发布博客。遇到需要插入代码都是先在notepad中写好,或者是拷贝到notepad,再从notepad中拷到Windows Live Writer,比较麻烦。在博客中使用插件Code Snippet就能很好解决这个问题。 下载地址&a…

linux之vifm和ranger操作文件管理器使用总结

1、介绍vifm和ranger vifm和ranger都是有图形的文件管理操作,有点类是windows上面的“我的电脑” 2、安装vifm和ranger 在终端输入下面命令 sudo apt-get install vifmsudo apt-ger install ranger 3、常规使用vifm 安装成功之后,我们在控制台输入vifm命令,然后显示下面…

.NET 运行时设置

.NET 运行时设置.NET 5(包括 .NET Core 版本)支持使用配置文件和环境变量在运行时配置 .NET 应用程序的行为。如果出现以下情况,则运行时配置是一个不错的选择:你不拥有或控制应用程序的源代码,因此无法以编程方式对其…

ElasticSearch——学习笔记

2019独角兽企业重金招聘Python工程师标准>>> Relational DB -> Databases -> Tables -> Rows -> Columns Elasticsearch -> Indices -> Types -> Documents -> Fields 转载于:https://my.oschina.net/u/2307114/blog/799905

linux之用wget下sublime简单使用总结

1、简单介绍wget 1)、wget命令在linux系统上面主要通过url下载, wget url 2)、比如我们需要断点续传我们加上参数 -c wget -c url 2、下载sublime 1)电脑32位 wget http://c758482.r82.cf2.rackcdn.com/Sublime\ Text\ 2.0.2.tar.…

C# dynamic 类型用法举例

dynamic类型允许编写忽略编译期间的类型检查的代码。编译器假定,给dynamic类型的对象定义的任操作都是有效的。如果该操作无效,则在代码运行之前不会检测该错误,如下面的示例所示:这个示例没有编译,因为它调用了staticPerson.GetF…