Welcome to YARP - 1.认识 YARP 并构建反向代理服务

目录

Welcome to YARP - 1.认识YARP并搭建反向代理服务

Welcome to YARP - 2.配置功能

Welcome to YARP - 3.负载均衡

Welcome to YARP - 4.限流

Welcome to YARP - 5.身份验证和授权

Welcome to YARP - 6.压缩、缓存

Welcome to YARP - 7.目标健康检查

Welcome to YARP - 8.分布式跟踪

目前规划了8篇文章,但是能写多少还不确定,哈哈哈。毕竟上班才是主线,只能空闲时间去了解

介绍

YARP 是微软在.NET Core基础架构之上实现的一个反向代理工具包,他的设计初衷是提供核心代理功能的库。

当然也有人拿它做为Gateway来使用。不是特别复杂的网关需求,那么YARP是完全可以胜任的。

什么是反向代理?

反向代理是一个中间层服务器,位于客户端和一个或多个后端服务器之间。它接收来自客户端的请求,然后将这些请求转发给一个或多个后端服务器,最终将后端服务器的响应返回给客户端。反向代理通常用于隐藏后端服务器的真实身份和细节,增加安全性,缓存内容,负责SSL终结等任务。

主要功能

  • 反向代理
  • 负载均衡
  • 限流(此功能仅在使用 .NET 7.0 或更高版本时可用)
  • 身份验证和授权
  • 压缩、缓存
  • 健康检查
  • 分布式跟踪等

主要特点

  • 高效、强大并具有.NET本身的特点:你可以在.NET中使用YARP快速构建一个强大、高性能的代理服务
  • 稳定可靠YAPR提供了主动和被动健康检查,还提供了多种问题诊断机制
  • 可定制化:可以添加或者替换模块来自定义这些功能。(其最大的特点就是可定制化

快速开始

本文演示的环境为:.NET 6 + YARP 2.0.1

注意:部分教程包括官方文档的实例代码用的都是2.0.0版本,但是2.0.0版本的YARP包官方已经报告出有严重的bug(A denial of service vulnerability exists in YARP.)拒绝服务(DOS)的漏洞。截止2023.10.25 YAPR只有两个可用的正式版本,分别是1.1.2和2.0.1。如果你的项目用的是1.x版本请升级到1.1.2,2.x版本则升级到2.0.1

1.创建项目

首先使用命令行创建一个 “空” 的ASP.NET Core 应用程序:

dotnet new web -n MyProxy -f net6.0

或者在 Visual Studio 2022 中创建新的 ASP.NET Core Web 应用程序。

2.添加项目引用

<ItemGroup> 
 <PackageReference Include="Yarp.ReverseProxy" Version="2.0.1" />
</ItemGroup> 

或者使用在程序包管理控制台输入一下命令

dotnet add package Yarp.ReverseProxy --version 2.0.1

3.添加 YARP 中间件

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()//添加ReverseProxy相关服务到DI
    //从配置文件中加载ReverseProxy的设置
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

var app = builder.Build();

app.MapReverseProxy();//使用ReverseProxy中间件

app.Run();

主要的代码就三行,已经用注释进行标注。

4.Configuration 配置

我们先用appsettings.json 文件来配置YARP。 当然还可以以编程方式提供配置。 下篇文章我们再用另一种方式实现。

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

具体配置是什么涵义可以往下看,或者移步第二篇看更详尽的配置说明。

5.运行项目

MyProxy.csproj文件目录下使用命令行工具运行dotnet run命令或者在VS中直接F5运行。

查看效果:

image-20231027174201370.png

可以看到我们已经代理了必应站点,当我们访问代理服务器(http://localhost:5177)时,显示的是必应的搜索界面,客户端对必应这个站点是完全无感知的,也不会知道必应的服务地址是多少

注意:项目本身注册的路由是不受代理影响的。当你访问此路由时不会被代理。例如:app.MapGet("/hello", () => "Hello World!"); 此时你访问http://localhost:5177/hello会正常返回结果,不会被代理到必应的。

image-20231027174113828.png

配置讲解

"ReverseProxy": {
   "Routes": {
     //描述一个路由,该路由根据匹配规则匹配传入的请求,并将匹配请求的代理到其ClusterId标识的群集。
     "route1" : {
       //与此路由匹配的集群标识。这里与下文的cluster1对应,如果路由匹配正确则访问cluster1配置的后端服务器地址。
       "ClusterId": "cluster1",
       //匹配规则 这里个正则表示匹配任何路径
       "Match": {
         "Path": "{**catch-all}"
       }
     }
   },
   //后端服务器集群
   "Clusters": {
     //集群标识
     "cluster1": {
       //服务器配置
       "Destinations": {
         //目标服务器1,可以有多个
         "destination1": {
           //服务器地址
           "Address": "https://cn.bing.com/"
         }
       }
     }
   }
 }

总结

本文介绍了YAPR是什么及功能优点和如何快速入门YARP。以上示例的代码已上传GitHub示例代码,在MyProxy文件夹下。

下一篇将介绍YAPR的配置功能:配置文件、Configuration Providers(可以有多种方式提供配置)、及Configuration Filters(配置过滤器)。

posted @ 2023-10-27 20:35  coding-y  阅读(2485)  评论(0编辑  收藏  举报