微软用它取代了 Nginx 性能提升了百分之八十!这也也太牛逼了吧

9,508 阅读5分钟

大家好,我是民工哥!

提到反向代理软件,大家肯定第一时间想到是:Nginx,没错,Nginx确实是一款非常优秀的反向代理软件,很多大厂都在使用,比如:微软。

不过,目前微软用它取代了 Nginx ,使得吞吐量提升了百分之八十!图片2021 年,微软将应用服务前端队列转换为 Kestrel + YARP。目前这个应用程序每天处理 160B+ 个 HTTP 请求,这是微软内部自己开发的一个应用程序,通过使用 .NET 的基础架构构建在 .NET 上的。图片所以,今天我们一起来学习一下 YARP。

YARP 简介

图片Yarp(Yet Another Reverse Proxy)是一个反向代理工具包,用于使用ASP.NET和.NET基础设施并在.NET中构建快速代理服务器。Yarp是一个轻量级的.NET反向代理,支持HTTP和HTTPS协议,可以将请求转发到其他服务器上。图片Yarp 基于.Net架构,因此可以在Windows和Linux上应用。Yarp最大的特点是可定制化,可以根据特定场景开发出需要的定制代理通道。你可以根据应用程序的特定需求进行自定义,使用规则来转发请求,并在转发请求时添加或修改HTTP头。

YARP 的功能特性

YARP具有许多主要特点,包括:

  • 高度模块化:YARP设计成高度模块化的,可以根据需要替换或扩展内部组件,如HTTP请求路由、负载均衡、健康检查等。
  • 高性能:YARP针对高性能进行了优化,利用.NET的异步编程模型和高效的IO操作,以处理大量并发连接。
  • 配置驱动:YARP的行为可以通过配置来控制,支持从文件、数据库或其他来源动态加载配置。
  • 可定制化:YARP最大的特点是可定制化,可以根据特定场景开发出需要的定制代理通道。
  • 稳定可靠:YARP提供了主动和被动健康检查,还提供了多种问题诊断机制。
  • 快速开始:YARP使开发人员能够完全控制,同时利用经过验证的ASP.NET Core和.NET功能集,以及C#(或其他.NET语言)的生产力。

此外,YARP还具有一些功能,如反向代理、负载均衡、限流(仅在使用.NET 7.0或更高版本时可用)、身份验证和授权、压缩、缓存、健康检查以及分布式跟踪等。

YARP 的使用场景

  • 负载均衡:分发请求到后端多个服务器,提高系统的可伸缩性和可靠性。
  • 内部网络隔离:隐藏内部服务器的IP地址,外部只能通过YARP访问内部服务器,从而保护内部网络的安全。
  • 缓存和加速:缓存请求和响应,减少对后端服务器的请求,加速内容的传输。
  • 身份验证和授权:通过集成的身份验证和授权机制,控制对后端服务器的访问,确保只有经过授权的用户才能访问特定的资源。
  • 流量控制和限流:YARP可以限制来自外部的请求速率,防止潜在的DDoS攻击或其他恶意流量,保护服务器免受攻击。
  • 日志和监控:记录请求和响应的详细日志,并提供对流量的监控和分析,帮助跟踪问题、分析性能瓶颈以及监控系统的健康。
  • API网关:在微服务架构中,YARP可以用作API网关,将来自客户端的请求路由到正确的微服务实例,并执行安全检查、速率限制等操作。

部署及使用

YARP 2.0.0 支持 ASP.NET Core 6.0 及更高版本。可以从 dotnet.microsoft.com/download/do… 下载 .NET SDK。

所以安装环境需要预先部署.Net环境,可以使用下面的命令检查:

dotnet --version

然后使用命令行创建一个空的 ASP.NET Core 项目

dotnet new web -n MyProxy -f net6.0

然后使用 nuget 管理工具手动添加包 Yarp.ReverseProxy,也可以使用命令模式添加

Install-Package Yarp.ReverseProxy

在Program.cs文件中注册Yarp

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

配置 appsettings.json

{
 "Logging": {
   "LogLevel": {
     "Default": "Information",
     "Microsoft""Warning",
     "Microsoft.Hosting.Lifetime""Information"
   }
 },
 "AllowedHosts": "*",
 "ReverseProxy": {
   "Routes": {
     "route1" : {
       "ClusterId": "cluster1",
       "Match": {
         "Path": "{**catch-all}"
       }
     }
   },
   "Clusters": {
     "cluster1": {
       "Destinations": { 
       "microsoft": { 
       "Address": "https://docs.microsoft.com/zh-cn/" },
       "github":{ 
       "Address": "https://github.com/" 
       } 
      } 
    } 
  } 
}   

配置完成后,运行项目即可,访问该站点将随机反向代理到微软官网和github,如下效果:图片更多操作及配置过程可参考:microsoft.github.io/reverse-pro…

YARP 与 Nginx 

两者都具有相同的功能,在相关的配置上肯定是可相互替代的,接下来演示这部分的配置内容。

路由匹配

YARP提供了类似于Nginx的路由匹配功能。

#Nginx 
/webapp
#YRAP
     "route1" : {
       "ClusterId""cluster1",
       "Match": {
         "Path""/webapp/{**catch-all}"
       }

负载均衡

YARP 具有内置的负载均衡功能,可以根据请求的属性(如URL路径、请求头、客户端IP等)将其转发到多个后端服务器。

#Nginx 配置负载均衡

upstream backend {
 server localhost:9002;
 server localhost:9003;
}
server {
 listen 8080;
 server_name localhost;
 
 location / {
  # backend 就是服务器组的名称
  proxy_pass http://backend/;
 }
}
#YARP配置负载均衡
"Destinations": { 
       "APP1": { 
       "Address": "https://10.0.0.1:9999" 
       },
       "APP2":{ 
       "Address": "https://10.0.0.1:8888" 
       }
}

官方给出的实例:图片

地址重写

Nginx  中地址重写直接使用 rewrite

server {
    location / {
        limit_conn myip 10;
        limit_conn myServerName 100;
        rewrite / http://www.mingongge.com permanent;
    }

Yarp 在 route中增加配置

"Transforms": [
          { "PathRemovePrefix": "/OMS" }
        ]

Forward 与 Timeout 配置

Forward配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

YARP 默认 X-Forwarded-For,需要配置成 X-Forwarded-Proto,X-Forwarded-Host 可在 Transforms 中进行修改。

Timeout 配置

Nginx 超时配置

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout  300;

Yarp 超时配置

"HttpRequest": {
    "ActivityTimeout": "<timespan>",#格式"ActivityTimeout": "00:00:30"
    "Version": "<string>",
    "VersionPolicy": ["RequestVersionOrLower", "RequestVersionOrHigher", "RequestVersionExact"],
    "AllowResponseBuffering": "<bool>"
}

总结

YARP 给微软 Azure 应用服务带来巨大的提升:

  • 吞吐量提高了近 80%。
  • Azure 应用的性能提升,降低了 CPU 使用率和内存占用率。
  • 支持 HTTP/3 等现代协议。
  • 支持新的客户方案,例如 gRPC 应用程序、主机密码套件配置、自定义错误页等。

由微软 .NET 核心团队开发的 Kestrel + YARP 这个创新技术还是非常有价值的,值得大家尝试引到自己的开发项目来。

—   特色专栏  —

 MySQL|PostgreSQL|Redis|MongoDB|Tools

ElasticSearch|Kubernetes|Docker|Hadoop

 Kafka|RabbitMQ|Zookeeper|OpenStack

企业监控平台|应用与服务|DevOps|集群管理