Conversation
| _type = nameof(WeightedRoundRobinLoadBalancer).Replace("LoadBalancer", ""); | ||
|
|
||
| // Веса по умолчанию, если не переданы | ||
| weights ??= new[] { 3, 2, 1}; | ||
|
|
||
| _sequence = []; | ||
|
|
||
| for (var i = 0; i < services.Count && i < weights.Length; i++) | ||
| { | ||
| var weight = weights[i]; | ||
| for (var j = 0; j < weight; j++) | ||
| { | ||
| _sequence.Add(services[i]); | ||
| } | ||
| } |
There was a problem hiding this comment.
У такого подхода будет проблема, если вес будет сильно больше, например условно 100000
Лучше математически вычислять нужный сервис, чем генерировать потенциально огромный список
| if (_sequence.Count == 0) | ||
| { | ||
| throw new InvalidOperationException("No available downstream services."); | ||
| } |
There was a problem hiding this comment.
В lock стоит включать только то, что потенциально может использоваться разными потоками, а все остальное лучше вынести
| private readonly object _lock = new(); | ||
| private readonly string _type; | ||
|
|
||
| public string Type => _type; |
There was a problem hiding this comment.
Можно сразу проинициализировать и избавиться от поля _type:
public string Type => nameof(WeightedRoundRobinLoadBalancer).Replace("LoadBalancer", "");| using Ocelot.LoadBalancer.Interfaces; | ||
| using Ocelot.Responses; | ||
| using Ocelot.ServiceDiscovery.Providers; | ||
| using Ocelot.Values; |
| using TrainingCourseApp.Gateway.LoadBalancer; | ||
| /// <summary> | ||
| /// Создатель балансировщика нагрузки WeightedRoundRobin с поддержкой весов из конфигурации | ||
| /// </summary> | ||
| public class WeightedRoundRobinCreator : ILoadBalancerCreator |
| .Select(s => s.HostAndPort) | ||
| .ToList(); | ||
|
|
||
| var balancer = new WeightedRoundRobinLoadBalancer(hostAndPorts); |
There was a problem hiding this comment.
Здесь вероятно нужно передавать веса в конструктор, которые можно например брать из конфигурации
| //builder.Services.AddCors(options => | ||
| // options.AddPolicy("AllowClient", policy => | ||
| // policy.WithOrigins(builder.Configuration.GetSection("CorsSettings:AllowedOrigins").Get<string[]>() ?? []) | ||
| // .WithMethods("GET") | ||
| // .AllowAnyHeader())); |
|
|
||
| var app = builder.Build(); | ||
|
|
||
| //app.UseCors("AllowClient"); |
| { | ||
| "Host": "localhost", | ||
| "Port": 8000, | ||
| "Metadata": { | ||
| "weight": "3" | ||
| } | ||
| }, | ||
| { | ||
| "Host": "localhost", | ||
| "Port": 8001, | ||
| "Metadata": { | ||
| "weight": "2" | ||
| } | ||
| }, | ||
| { | ||
| "Host": "localhost", | ||
| "Port": 8002, | ||
| "Metadata": { | ||
| "weight": "1" | ||
| } | ||
| } |
There was a problem hiding this comment.
Если в aspire поменять порты, то все сломается
Нужно переопределять эту секцию настроек, если из aspire приходят адреса сервисов генераторов
| .WithHttpsEndpoint(8000 + i) | ||
| .WithReference(redis) | ||
| .WaitFor(redis); | ||
| gateway.WaitFor(service); |
There was a problem hiding this comment.
А они начнут приходить в переменных окружения, если здесь добавить .WithReference(service)
ФИО: Чугунов Владислав
Номер группы: 6511
Номер лабораторной: 2
Номер варианта: 16
Краткое описание предметной области: Учебный курс
Краткое описание добавленных фич: Добавлен балансировщик нагрузки