介绍
每当有多个可用的健康目标时,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";