YARP Docsv2.3
文档/配置/配置文件

配置文件

从 appsettings.json 或任何其他 IConfiguration 源加载路由和群集,并让代理在无需重启的情况下自动应用 这些变更。

加载配置

YARP 可以从任何 IConfiguration 源加载其路由和群集——下面的示例中使用的是 appsettings.json,但任何提供程序的工作方式都相同。每当配置源发生变化时,代理都会重新读取配置并自动应用变更,无需重启。

Program.cs

从配置的 "ReverseProxy" 节注册代理。

C#using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddReverseProxy()
    .LoadFromConfig(builder.Configuration.GetSection("ReverseProxy"));

var app = builder.Build();
app.MapReverseProxy();
app.Run();
说明

配置在加载之后、验证和应用之前可以被修改——请参阅配置筛选器

配置结构

传递给 LoadFromConfig 的命名节——即上文中的 "ReverseProxy"——包含两个子节:RoutesClusters

JSON{
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Match": {
          "Path": "{**catch-all}",
          "Hosts": ["www.aaaaa.com", "www.bbbbb.com"]
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": { "Address": "https://example.com/" }
        }
      }
    }
  }
}

路由

Routes 是一个无序的路由条目集合,每个条目至少需要包含:

  • RouteId — 该路由的唯一名称。
  • ClusterIdClusters 中某个条目的名称,匹配该路由的请求会被发送到该条目。
  • Match — 一个 Hosts 数组、一个 Path 模式(一个 ASP.NET Core 路由模板),或两者兼有。

当多个路由都可能匹配同一个请求时,匹配最精确的路由胜出——有关优先级的详细工作方式,请参阅基于标头的路由,或者直接设置显式的 Order(值越小优先级越高)来控制。标头、授权、CORS 以及其他按请求应用的策略,也都可以在路由条目上设置。

群集

Clusters 是一个由具名群集组成的无序集合。每个群集包含一组具名的 Destinations——被认为能够处理指向该群集的任何路由请求的后端地址。一旦路由匹配成功,该群集的负载均衡策略就会选择实际处理该请求的目标——请参阅负载均衡

多个配置源

LoadFromConfig 可以被多次调用,分别指向不同的节,甚至不同的提供程序——可以将其与自定义配置提供程序结合使用,从完全不同的位置加载配置:

C#services.AddReverseProxy()
    .LoadFromConfig(Configuration.GetSection("ReverseProxy1"))
    .LoadFromConfig(Configuration.GetSection("ReverseProxy2"));

在一个源中定义的路由可以引用在另一个源中定义的群集。不支持的是跨两个源合并同一路由或群集的部分配置——每个路由或群集都必须完整地来自单一来源。

所有配置属性

以下示例展示了一个路由和一个完整指定的群集,并列出了所有顶级属性:

完整参考结构

大多数字段都是可选的;路由上只有 RouteId/ClusterId/Match、群集上只有 Destinations 是必需的。HealthCheckSessionAffinity 以及 HttpClient/HttpRequest 各自都有专门的页面——请参阅目标运行状况检查会话相关性HTTP 客户端配置

JSON{
  "ReverseProxy": {
    "Routes": {
      "route1": {
        "ClusterId": "cluster1",
        "Order": 100,
        "MaxRequestBodySize": 1000000,
        "AuthorizationPolicy": "Anonymous",
        "CorsPolicy": "Default",
        "Match": {
          "Path": "/something/{**remainder}",
          "Hosts": ["www.aaaaa.com", "www.bbbbb.com"],
          "Methods": ["GET", "PUT"],
          "Headers": [
            { "Name": "MyCustomHeader", "Values": ["value1", "value2"], "Mode": "ExactHeader" }
          ],
          "QueryParameters": [
            { "Name": "MyQueryParameter", "Values": ["value1", "value2"], "Mode": "Exact" }
          ]
        },
        "Metadata": { "MyName": "MyValue" },
        "Transforms": [{ "RequestHeader": "MyHeader", "Set": "MyValue" }]
      }
    },
    "Clusters": {
      "cluster1": {
        "LoadBalancingPolicy": "PowerOfTwoChoices",
        "Destinations": {
          "cluster1/destination1": { "Address": "https://contoso.com" },
          "cluster1/destination2": { "Address": "https://10.20.30.40", "Health": "https://10.20.30.40:12345/test" }
        },
        "SessionAffinity": { "Enabled": true, "Policy": "Cookie" },
        "HealthCheck": {
          "Active": { "Enabled": true, "Interval": "00:00:10", "Path": "/api/health" },
          "Passive": { "Enabled": true, "Policy": "TransportFailureRateHealthPolicy" }
        },
        "HttpClient": { "SslProtocols": "Tls13", "MaxConnectionsPerServer": 1024 },
        "Metadata": { "MyKey": "MyValue" }
      }
    }
  }
}
改编自 Microsoft Learn ,遵循 CC BY 4.0 许可协议。