YARP 负载均衡

介绍

每当有多个可用的健康目标时,YARP 必须决定哪一个用于给定请求。 YARP 附带内置负载均衡算法,但也为任何自定义负载均衡方法提供扩展性。

配置

服务和中间件注册

负载均衡策略通过 AddLoadBalancingPolicies() 方法在 DI 容器中注册,由 AddReverseProxy()自动调用。

中间件随 UseLoadBalancing()一起添加,该中间件默认包含在无参数 MapReverseProxy 方法中。

群集配置

可以通过设置 LoadBalancingPolicy来配置用于确定目标的算法。

如果未指定任何策略,将使用 PowerOfTwoChoices

文件示例

"ReverseProxy": {
  "Clusters": {
    "cluster1": {
      "LoadBalancingPolicy": "RoundRobin",
      "Destinations": {
        "cluster1/destination1": {
          "Address": "https://localhost:10000/"
        },
        "cluster1/destination2": {
          "Address": "https://localhost:10010/"
        }
      }
    }
  }
}

代码示例

var clusters = new[]
{
    new ClusterConfig()
    {
        ClusterId = "cluster1",
        LoadBalancingPolicy = LoadBalancingPolicies.RoundRobin,
        Destinations = new Dictionary<string, DestinationConfig>(StringComparer.OrdinalIgnoreCase)
        {
            { "destination1", new DestinationConfig() { Address = "https://localhost:10000" } },
            { "destination2", new DestinationConfig() { Address = "https://localhost:10010" } }
        }
    }
};

内置策略

YARP 自带以下内置策略:

  • FirstAlphabetical

在不考虑加载的情况下按字母顺序选择第一个可用目标。 这对于双目标故障转移系统非常有用。

  • Random

随机选择目标。

  • PowerOfTwoChoices (默认值)

选择两个随机目标,然后选择具有最小分配请求的一个目标。 这可以避免 LeastRequests 的开销和 Random 的最坏情况,即选择一个繁忙的目标。

  • RoundRobin

通过按顺序循环来选择目标。

  • LeastRequests

选择分配请求最少的目标。 这需要检查所有目标。

可扩展性

ILoadBalancingPolicy 负责从可用健康目标列表中选择目标。

可以在 DI 中提供自定义实现。

// Implement the ILoadBalancingPolicy
public sealed class LastLoadBalancingPolicy : ILoadBalancingPolicy
{
    public string Name => "Last";

    public DestinationState? PickDestination(HttpContext context, ClusterState cluster, IReadOnlyList<DestinationState> availableDestinations)
    {
        return availableDestinations[^1];
    }
}

// Register it in DI in ConfigureServices method
services.AddSingleton<ILoadBalancingPolicy, LastLoadBalancingPolicy>();

// Set the LoadBalancingPolicy on the cluster
cluster.LoadBalancingPolicy = "Last";