Conversation
…я данных соответствовал серверу
| public class QueryBasedLoadBalancer(ILogger<QueryBasedLoadBalancer> logger, Func<Task<List<Service>>> services) | ||
| : ILoadBalancer | ||
| { | ||
| private static readonly object _lock = new(); |
There was a problem hiding this comment.
Тут либо использовать PascalCase, либо s_ из гайдлайнов (хотя лично я не особо фанат таких префиксов)
| lock (_lock) | ||
| { |
There was a problem hiding this comment.
У тебя тут нет разделяемых данных, тебе нечего лочить
| var queryParams = query | ||
| .OrderBy(kvp => kvp.Key, StringComparer.Ordinal) | ||
| .Select(kvp => $"{kvp.Key}={string.Join(",", kvp.Value.OrderBy(v => v))}") | ||
| .ToList(); | ||
|
|
||
| var hashKey = string.Join("&", queryParams); | ||
| var hash = hashKey.GetHashCode(); | ||
| if (hash < 0) | ||
| { | ||
| hash = -hash; | ||
| } | ||
| var index = (hash % currentServices.Count); |
There was a problem hiding this comment.
Более того, ты как будто тут планируешь сделать этот балансировщик универсальным, чтобы потенциально использовать его на разных маршрутах
| public class QueryBasedLoadBalancer(ILogger<QueryBasedLoadBalancer> logger, Func<Task<List<Service>>> services) | ||
| : ILoadBalancer | ||
| { | ||
| private static readonly object _lock = new(); |
There was a problem hiding this comment.
А _lock у тебя тут статический, так что все балансировщики перелочат друг друга, если будут существовать несколько экземпляров службы
| var generator1 = builder.AddProject<Projects.ResidentialBuilding_Generator>("generator-1") | ||
| .WithReference(cache, "residential-building-cache") | ||
| .WithEndpoint("http", endpoint => endpoint.Port = 5201) | ||
| .WaitFor(cache); | ||
|
|
||
| var generator2 = builder.AddProject<Projects.ResidentialBuilding_Generator>("generator-2") | ||
| .WithReference(cache, "residential-building-cache") | ||
| .WithEndpoint("http", endpoint => endpoint.Port = 5202) | ||
| .WaitFor(cache); | ||
|
|
||
| var generator3 = builder.AddProject<Projects.ResidentialBuilding_Generator>("generator-3") | ||
| .WithReference(cache, "residential-building-cache") | ||
| .WithEndpoint("http", endpoint => endpoint.Port = 5203) | ||
| .WaitFor(cache); | ||
|
|
||
| var generator4 = builder.AddProject<Projects.ResidentialBuilding_Generator>("generator-4") | ||
| .WithReference(cache, "residential-building-cache") | ||
| .WithEndpoint("http", endpoint => endpoint.Port = 5204) | ||
| .WaitFor(cache); | ||
|
|
||
| var generator5 = builder.AddProject<Projects.ResidentialBuilding_Generator>("generator-5") | ||
| .WithReference(cache, "residential-building-cache") | ||
| .WithEndpoint("http", endpoint => endpoint.Port = 5205) | ||
| .WaitFor(cache); |
| .WithReference(generator1) | ||
| .WithReference(generator2) | ||
| .WithReference(generator3) | ||
| .WithReference(generator4) | ||
| .WithReference(generator5) |
There was a problem hiding this comment.
Гейтвею не нужны референсы на сервисы, референсы попадают в appsettings.json, а конфиг у тебя в ocelot.json
| .WaitFor(generator1) | ||
| .WaitFor(generator2) | ||
| .WaitFor(generator3) | ||
| .WaitFor(generator4) | ||
| .WaitFor(generator5); |
| builder.Services.AddCors(options => | ||
| { | ||
| options.AddPolicy("AllowLocalDev", policy => | ||
| { | ||
| policy | ||
| .AllowAnyOrigin() | ||
| .WithHeaders("Content-Type") | ||
| .WithMethods("GET"); | ||
| }); | ||
| }); |
There was a problem hiding this comment.
А зачем тебе тут корс? У тебя клиент больше не стучится в сервис напрямую
| { | ||
| "Routes": [ | ||
| { | ||
| "DownstreamPathTemplate": "/api/{everything}", |
There was a problem hiding this comment.
Тебе серьёзно нужен тут плейсхолдер? у тебя всего один маршрут
| { | ||
| hash = -hash; | ||
| } | ||
| var index = (hash % currentServices.Count); |




ФИО: Елагин Денис
Номер группы: 6513
Номер лабораторной: 2
Номер варианта: 38
Краткое описание предметной области: Объект жилого строительства
Краткое описание добавленных фич: сделал query based балансировщик нагрузки, подключил его в ocelot-е для 5 реплик сервиса-генератора