Table of Contents

如何扩展负载均衡策略

已经内置如下负载均衡策略

  • Random

    随机选择目标。(默认值)

  • PowerOfTwoChoices

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

  • RoundRobin

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

  • LeastRequests

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

如果不满足大家需求,可以通过如下方式扩展

首先实现ILoadBalancingPolicy接口

public interface ILoadBalancingPolicy
{
    string Name { get; }

    DestinationState? PickDestination(IReverseProxyFeature feature, IReadOnlyList<DestinationState> availableDestinations);
}

这里直接列举 最简单的Random 实现

public sealed class TestRandomLoadBalancingPolicy : ILoadBalancingPolicy
{
    public string Name => "TestRandom";

    public DestinationState? PickDestination(IReverseProxyFeature feature, IReadOnlyList<DestinationState> availableDestinations)
    {
        return availableDestinations[Random.Shared.Next(availableDestinations.Count)];
    }
}

然后注入DI

var app = Host.CreateDefaultBuilder(args)
    .ConfigureServices(i =>
    {
        i.AddSingleton<ILoadBalancingPolicy, TestRandomLoadBalancingPolicy>(); // 这一行
    })
    .UseReverseProxy()
    .Build();

await app.RunAsync();

大家在配置时还要指定一下

{
  "ReverseProxy": {
    "Clusters": {
      // Clusters id : httpTestCluster
      "httpTestCluster": {
        "LoadBalancingPolicy": "TestRandom", // 使用自定义的策略
        "Destinations": [
          {
            "Address": "127.0.0.1:5005" 
          },
          {
            "Address": "198.0.0.1:5005" 
          },
          {
            "Address": "198.0.0.2:5005" 
          }
        ]
      }
    }
  }
}