From 7e6c42cd9e9535f13ae246bde39f42b4c9c43a0d Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Thu, 19 Feb 2026 16:32:31 +0400 Subject: [PATCH 01/10] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BB=D0=B0=D0=B1=D0=BE=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD?= =?UTF-8?q?=D0=B0=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenerationService/Models/Course.cs | 57 +++++++++++++ GenerationService/Program.cs | 58 +++++++++++++ README.md | 131 +++-------------------------- ServiceDefaults/Extensions.cs | 84 ++++++++++++++++++ 4 files changed, 211 insertions(+), 119 deletions(-) create mode 100644 GenerationService/Models/Course.cs create mode 100644 GenerationService/Program.cs create mode 100644 ServiceDefaults/Extensions.cs diff --git a/GenerationService/Models/Course.cs b/GenerationService/Models/Course.cs new file mode 100644 index 00000000..9d9e7805 --- /dev/null +++ b/GenerationService/Models/Course.cs @@ -0,0 +1,57 @@ +namespace GenerationService.Models; + +/// +/// Модель, описывающая учебный курс и его основные метаданные +/// +public class Course +{ + /// + /// Уникальный идентификатор курса + /// + public int Id { get; init; } + + /// + /// Название курса + /// + public string Name { get; init; } = string.Empty; + + /// + /// Полное имя преподавателя курса + /// + public string TeacherFullName { get; init; } = string.Empty; + + /// + /// Дата начала курса + /// + public DateOnly StartDate { get; init; } + + /// + /// Дата окончания курса + /// + public DateOnly EndDate { get; init; } + + /// + /// Максимально допустимое количество студентов, которые могут быть зачислены на курс + /// + public int MaxStudents { get; init; } + + /// + /// Текущее количество записанных студентов + /// + public int CurrentStudents { get; init; } + + /// + /// Выдаётся ли по окончании курса сертификат + /// + public bool HasCertificate { get; init; } + + /// + /// Стоимость курса + /// + public decimal Cost { get; init; } + + /// + /// Рейтинг курса + /// + public int Rating { get; init; } +} diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs new file mode 100644 index 00000000..3fd46b75 --- /dev/null +++ b/GenerationService/Program.cs @@ -0,0 +1,58 @@ +using GenerationService.Models; +using GenerationService.Services; +using Microsoft.Extensions.Caching.Distributed; +using System.Text.Json; +using ServiceDefaults; + +var builder = WebApplication.CreateBuilder(args); + +builder.AddServiceDefaults(); + +builder.AddRedisDistributedCache("cache"); + +builder.Services.AddCors(options => + options.AddDefaultPolicy(policy => + policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); + +var app = builder.Build(); + +app.UseCors(); +app.MapDefaultEndpoints(); + +app.MapGet("/course", async (int id, IDistributedCache cache, ILogger logger) => +{ + if (id <= 0) + return Results.BadRequest("Received invalid ID. ID must be a positive number"); + + var cacheKey = $"course:{id}"; + + var cached = await cache.GetStringAsync(cacheKey); + if (cached is not null) + { + var cachedCourse = JsonSerializer.Deserialize(cached); + if (cachedCourse is not null) + { + logger.LogInformation("Cache hit for course with id {CourseId}", id); + return Results.Ok(cachedCourse); + } + } + + logger.LogInformation("Cache miss for course with id {CourseId}, generating new data", id); + var course = CourseGenerator.Generate(id); + + await cache.SetStringAsync( + cacheKey, + JsonSerializer.Serialize(course), + new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) + }); + + logger.LogInformation( + "Generated and cached course {CourseName} with id {CourseId}", + course.Name, id); + + return Results.Ok(course); +}); + +app.Run(); diff --git a/README.md b/README.md index dcaa5eb7..f1b8b2e8 100644 --- a/README.md +++ b/README.md @@ -1,128 +1,21 @@ -# Современные технологии разработки программного обеспечения -[Таблица с успеваемостью](https://docs.google.com/spreadsheets/d/1an43o-iqlq4V_kDtkr_y7DC221hY9qdhGPrpII27sH8/edit?usp=sharing) +## Цель лабораторной работы +Реализация минимального микросервисного бэкенда с кэшированием -## Задание -### Цель -Реализация проекта микросервисного бекенда. +## Технологии и требования -### Задачи -* Реализация межсервисной коммуникации, -* Изучение работы с брокерами сообщений, -* Изучение архитектурных паттернов, -* Изучение работы со средствами оркестрации на примере .NET Aspire, -* Повторение основ работы с системами контроля версий, -* Интеграционное тестирование. +- .NET 8 +- Redis +- Bogus -### Лабораторные работы -
-1. «Кэширование» - Реализация сервиса генерации контрактов, кэширование его ответов -
- -В рамках первой лабораторной работы необходимо: -* Реализовать сервис генерации контрактов на основе Bogus, -* Реализовать кеширование при помощи IDistributedCache и Redis, -* Реализовать структурное логирование сервиса генерации, -* Настроить оркестрацию Aspire. - -
-
-2. «Балансировка нагрузки» - Реализация апи гейтвея, настройка его работы -
- -В рамках второй лабораторной работы необходимо: -* Настроить оркестрацию на запуск нескольких реплик сервиса генерации, -* Реализовать апи гейтвей на основе Ocelot, -* Имплементировать алгоритм балансировки нагрузки согласно варианту. +## Что я сделал в проекте -
-
-
-3. «Интеграционное тестирование» - Реализация файлового сервиса и объектного хранилища, интеграционное тестирование бекенда -
+В рамках этой лабораторной работы реализовано и настроено следующее: -В рамках третьей лабораторной работы необходимо: -* Добавить в оркестрацию объектное хранилище, -* Реализовать файловый сервис, сериализующий сгенерированные данные в файлы и сохраняющий их в объектном хранилище, -* Реализовать отправку генерируемых данных в файловый сервис посредством брокера, -* Реализовать интеграционные тесты, проверяющие корректность работы всех сервисов бекенда вместе. +- HTTP-эндпоинт `GET /course?id={id}` в сервисе `GenerationService`, возвращающий DTO `Course`. +- Механизм генерации данных курсов (используется Bogus)., +- Кэширование ответов через `IDistributedCache` с провайдером Redis: ключи `course:{id}`, TTL 10 минут. +- Набор расширений `ServiceDefaults` для единообразной конфигурации сервисов: OpenTelemetry (метрики/трейсы), health checks и настройки `HttpClient`. -
-
-
-4. (Опционально) «Переход на облачную инфраструктуру» - Перенос бекенда в Yandex Cloud -
- -В рамках четвертой лабораторной работы необходимо перенестиервисы на облако все ранее разработанные сервисы: -* Клиент - в хостинг через отдельный бакет Object Storage, -* Сервис генерации - в Cloud Function, -* Апи гейтвей - в Serverless Integration как API Gateway, -* Брокер сообщений - в Message Queue, -* Файловый сервис - в Cloud Function, -* Объектное хранилище - в отдельный бакет Object Storage, -
-
-## Задание. Общая часть -**Обязательно**: -* Реализация серверной части на [.NET 8](https://learn.microsoft.com/ru-ru/dotnet/core/whats-new/dotnet-8/overview). -* Оркестрация проектов при помощи [.NET Aspire](https://learn.microsoft.com/ru-ru/dotnet/aspire/get-started/aspire-overview). -* Реализация сервиса генерации данных при помощи [Bogus](https://github.com/bchavez/Bogus). -* Реализация тестов с использованием [xUnit](https://xunit.net/?tabs=cs). -* Создание минимальной документации к проекту: страница на GitHub с информацией о задании, скриншоты приложения и прочая информация. - -**Факультативно**: -* Перенос бекенда на облачную инфраструктуру Yandex Cloud - -Внимательно прочитайте [дискуссии](https://github.com/itsecd/cloud-development/discussions/1) о том, как работает автоматическое распределение на ревью. -Сразу корректно называйте свои pr, чтобы они попали на ревью нужному преподавателю. - -По итогу работы в семестре должна получиться следующая информационная система: -
-C4 диаграмма -Современные_технологии_разработки_ПО_drawio -
- -## Варианты заданий -Номер варианта задания присваивается в начале семестра. Изменить его нельзя. Каждый вариант имеет уникальную комбинацию из предметной области, базы данных и технологии для общения сервиса генерации данных и сервера апи. - -[Список вариантов](https://docs.google.com/document/d/1WGmLYwffTTaAj4TgFCk5bUyW3XKbFMiBm-DHZrfFWr4/edit?usp=sharing) -[Список предметных областей и алгоритмов балансировки](https://docs.google.com/document/d/1PLn2lKe4swIdJDZhwBYzxqFSu0AbY2MFY1SUPkIKOM4/edit?usp=sharing) - -## Схема сдачи - -На каждую из лабораторных работ необходимо сделать отдельный [Pull Request (PR)](https://docs.github.com/en/pull-requests). - -Общая схема: -1. Сделать форк данного репозитория -2. Выполнить задание -3. Сделать PR в данный репозиторий -4. Исправить замечания после code review -5. Получить approve - -## Критерии оценивания - -Конкурентный принцип. -Так как задания в первой лабораторной будут повторяться между студентами, то выделяются следующие показатели для оценки: -1. Скорость разработки -2. Качество разработки -3. Полнота выполнения задания - -Быстрее делаете PR - у вас преимущество. -Быстрее получаете Approve - у вас преимущество. -Выполните нечто немного выходящее за рамки проекта - у вас преимущество. -Не укладываетесь в дедлайн - получаете минимально возможный балл. - -### Шкала оценивания - -- **3 балла** за качество кода, из них: - - 2 балла - базовая оценка - - 1 балл (но не более) можно получить за выполнение любого из следующих пунктов: - - Реализация факультативного функционала - - Выполнение работы раньше других: первые 5 человек из каждой группы, которые сделали PR и получили approve, получают дополнительный балл - -## Вопросы и обратная связь по курсу - -Чтобы задать вопрос по лабораторной, воспользуйтесь [соответствующим разделом дискуссий](https://github.com/itsecd/cloud-development/discussions/categories/questions) или заведите [ишью](https://github.com/itsecd/cloud-development/issues/new). -Если у вас появились идеи/пожелания/прочие полезные мысли по преподаваемой дисциплине, их можно оставить [здесь](https://github.com/itsecd/cloud-development/discussions/categories/ideas). diff --git a/ServiceDefaults/Extensions.cs b/ServiceDefaults/Extensions.cs new file mode 100644 index 00000000..40277400 --- /dev/null +++ b/ServiceDefaults/Extensions.cs @@ -0,0 +1,84 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using OpenTelemetry; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace ServiceDefaults; + +public static class ServiceDefaultsExtensions +{ + public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder) + { + builder.ConfigureOpenTelemetry(); + builder.AddDefaultHealthChecks(); + + builder.Services.AddServiceDiscovery(); + builder.Services.ConfigureHttpClientDefaults(http => + { + http.AddStandardResilienceHandler(); + http.AddServiceDiscovery(); + }); + + return builder; + } + + public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder) + { + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddRuntimeInstrumentation(); + }) + .WithTracing(tracing => + { + tracing.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(); + }); + + builder.AddOpenTelemetryExporters(); + return builder; + } + + private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder) + { + var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + if (useOtlpExporter) + { + builder.Services.AddOpenTelemetry().UseOtlpExporter(); + } + return builder; + } + + public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder) + { + builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); + return builder; + } + + public static WebApplication MapDefaultEndpoints(this WebApplication app) + { + if (app.Environment.IsDevelopment()) + { + app.MapHealthChecks("/health"); + app.MapHealthChecks("/alive", new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + } + return app; + } +} From 30c9894009664d17c6b4895af37d725f77808313 Mon Sep 17 00:00:00 2001 From: AlexPrib <113890812+AlexPrib@users.noreply.github.com> Date: Thu, 19 Feb 2026 16:36:47 +0400 Subject: [PATCH 02/10] Add images to README for visual enhancement Added images to README for better visual representation. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index f1b8b2e8..0807a539 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,13 @@ - Кэширование ответов через `IDistributedCache` с провайдером Redis: ключи `course:{id}`, TTL 10 минут. - Набор расширений `ServiceDefaults` для единообразной конфигурации сервисов: OpenTelemetry (метрики/трейсы), health checks и настройки `HttpClient`. +Снимок экрана 2026-02-19 162728 +Снимок экрана 2026-02-19 162815 +Снимок экрана 2026-02-19 162752 +Снимок экрана 2026-02-19 162917 + + + From 2da569913c55f0ef1715d0258f5ff99dcc2425cd Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Thu, 26 Feb 2026 17:08:53 +0400 Subject: [PATCH 03/10] =?UTF-8?q?=D0=97=D0=B0=D0=BA=D0=B8=D0=BD=D1=83?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=81=D1=82=D0=B0=D1=8E=D1=89?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppHost/AppHost.csproj | 22 ++++++ AppHost/Program.cs | 13 ++++ AppHost/Properties/launchSettings.json | 17 ++++ Client.Wasm/Components/StudentCard.razor | 8 +- Client.Wasm/Properties/launchSettings.json | 6 +- Client.Wasm/wwwroot/appsettings.json | 4 +- CloudDevelopment.sln | 54 +++++++++++++ GenerationService/GenerationService.csproj | 18 +++++ GenerationService/Program.cs | 2 +- .../Properties/launchSettings.json | 23 ++++++ GenerationService/Services/CourseGenerator.cs | 77 +++++++++++++++++++ .../appsettings.Development.json | 1 + GenerationService/appsettings.json | 12 +++ ServiceDefaults/Extensions.cs | 10 +-- ServiceDefaults/ServiceDefaults.csproj | 20 +++++ 15 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 AppHost/AppHost.csproj create mode 100644 AppHost/Program.cs create mode 100644 AppHost/Properties/launchSettings.json create mode 100644 GenerationService/GenerationService.csproj create mode 100644 GenerationService/Properties/launchSettings.json create mode 100644 GenerationService/Services/CourseGenerator.cs create mode 100644 GenerationService/appsettings.Development.json create mode 100644 GenerationService/appsettings.json create mode 100644 ServiceDefaults/ServiceDefaults.csproj diff --git a/AppHost/AppHost.csproj b/AppHost/AppHost.csproj new file mode 100644 index 00000000..5ad35926 --- /dev/null +++ b/AppHost/AppHost.csproj @@ -0,0 +1,22 @@ + + + + + + Exe + net8.0 + enable + enable + + + + + + + + + + + + + diff --git a/AppHost/Program.cs b/AppHost/Program.cs new file mode 100644 index 00000000..517407f2 --- /dev/null +++ b/AppHost/Program.cs @@ -0,0 +1,13 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var cache = builder.AddRedis("cache"); + +var generationService = builder.AddProject("generation-service") + .WithReference(cache) + .WaitFor(cache); + +builder.AddProject("client-wasm") + .WithExternalHttpEndpoints() + .WaitFor(generationService); + +builder.Build().Run(); diff --git a/AppHost/Properties/launchSettings.json b/AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..dba56c07 --- /dev/null +++ b/AppHost/Properties/launchSettings.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17136;http://localhost:15136", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21197", + "ASPIRE_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:20131" + } + } + } +} diff --git a/Client.Wasm/Components/StudentCard.razor b/Client.Wasm/Components/StudentCard.razor index 661f1181..beaf9f05 100644 --- a/Client.Wasm/Components/StudentCard.razor +++ b/Client.Wasm/Components/StudentCard.razor @@ -4,10 +4,10 @@ - Номер №X "Название лабораторной" - Вариант №Х "Название варианта" - Выполнена Фамилией Именем 65ХХ - Ссылка на форк + Номер №1 "Кэширование" + Вариант №12 "Учебный курс" + Выполнена Прибыловым Александром 6511 + Ссылка на форк diff --git a/Client.Wasm/Properties/launchSettings.json b/Client.Wasm/Properties/launchSettings.json index 0d824ea7..60120ec3 100644 --- a/Client.Wasm/Properties/launchSettings.json +++ b/Client.Wasm/Properties/launchSettings.json @@ -12,7 +12,7 @@ "http": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": true, + "launchBrowser": false, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "applicationUrl": "http://localhost:5127", "environmentVariables": { @@ -22,7 +22,7 @@ "https": { "commandName": "Project", "dotnetRunMessages": true, - "launchBrowser": true, + "launchBrowser": false, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "applicationUrl": "https://localhost:7282;http://localhost:5127", "environmentVariables": { @@ -31,7 +31,7 @@ }, "IIS Express": { "commandName": "IISExpress", - "launchBrowser": true, + "launchBrowser": false, "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" diff --git a/Client.Wasm/wwwroot/appsettings.json b/Client.Wasm/wwwroot/appsettings.json index d1fe7ab3..82d75124 100644 --- a/Client.Wasm/wwwroot/appsettings.json +++ b/Client.Wasm/wwwroot/appsettings.json @@ -6,5 +6,5 @@ } }, "AllowedHosts": "*", - "BaseAddress": "" -} + "BaseAddress": "http://localhost:5134/course" +} \ No newline at end of file diff --git a/CloudDevelopment.sln b/CloudDevelopment.sln index cb48241d..65c35637 100644 --- a/CloudDevelopment.sln +++ b/CloudDevelopment.sln @@ -5,16 +5,70 @@ VisualStudioVersion = 17.14.36811.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Wasm", "Client.Wasm\Client.Wasm.csproj", "{AE7EEA74-2FE0-136F-D797-854FD87E022A}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceDefaults", "ServiceDefaults\ServiceDefaults.csproj", "{0857E538-DB2E-4DDC-88C1-1FDF48405F7A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenerationService", "GenerationService\GenerationService.csproj", "{6A40CB16-F88F-47CF-AF4A-95B01FF8054D}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppHost", "AppHost\AppHost.csproj", "{916C4526-14E2-484A-AD98-72F31B11CA7B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|x64.Build.0 = Debug|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Debug|x86.Build.0 = Debug|Any CPU {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|Any CPU.ActiveCfg = Release|Any CPU {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|Any CPU.Build.0 = Release|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|x64.ActiveCfg = Release|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|x64.Build.0 = Release|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|x86.ActiveCfg = Release|Any CPU + {AE7EEA74-2FE0-136F-D797-854FD87E022A}.Release|x86.Build.0 = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|x64.ActiveCfg = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|x64.Build.0 = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|x86.ActiveCfg = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Debug|x86.Build.0 = Debug|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|Any CPU.Build.0 = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|x64.ActiveCfg = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|x64.Build.0 = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|x86.ActiveCfg = Release|Any CPU + {0857E538-DB2E-4DDC-88C1-1FDF48405F7A}.Release|x86.Build.0 = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|x64.ActiveCfg = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|x64.Build.0 = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|x86.ActiveCfg = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Debug|x86.Build.0 = Debug|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|Any CPU.Build.0 = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|x64.ActiveCfg = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|x64.Build.0 = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|x86.ActiveCfg = Release|Any CPU + {6A40CB16-F88F-47CF-AF4A-95B01FF8054D}.Release|x86.Build.0 = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|x64.ActiveCfg = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|x64.Build.0 = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|x86.ActiveCfg = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Debug|x86.Build.0 = Debug|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|Any CPU.Build.0 = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x64.ActiveCfg = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x64.Build.0 = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x86.ActiveCfg = Release|Any CPU + {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/GenerationService/GenerationService.csproj b/GenerationService/GenerationService.csproj new file mode 100644 index 00000000..e670c270 --- /dev/null +++ b/GenerationService/GenerationService.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs index 3fd46b75..72b9db12 100644 --- a/GenerationService/Program.cs +++ b/GenerationService/Program.cs @@ -1,8 +1,8 @@ +using ServiceDefaults; using GenerationService.Models; using GenerationService.Services; using Microsoft.Extensions.Caching.Distributed; using System.Text.Json; -using ServiceDefaults; var builder = WebApplication.CreateBuilder(args); diff --git a/GenerationService/Properties/launchSettings.json b/GenerationService/Properties/launchSettings.json new file mode 100644 index 00000000..b29e0a00 --- /dev/null +++ b/GenerationService/Properties/launchSettings.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5134", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7134;http://localhost:5134", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/GenerationService/Services/CourseGenerator.cs b/GenerationService/Services/CourseGenerator.cs new file mode 100644 index 00000000..53d8107a --- /dev/null +++ b/GenerationService/Services/CourseGenerator.cs @@ -0,0 +1,77 @@ +using Bogus; +using GenerationService.Models; + +namespace GenerationService.Services; + +public static class CourseGenerator +{ + private static readonly string[] _courseNames = + [ + "Основы программирования", + "Математический анализ", + "Линейная алгебра", + "Теория вероятностей и математическая статистика", + "Базы данных и СУБД", + "Операционные системы", + "Компьютерные сети", + "Машинное обучение", + "Веб-разработка", + "Алгоритмы и структуры данных", + "Компьютерная графика", + "Искусственный интеллект", + "Облачные технологии", + "Кибербезопасность", + "Проектирование программного обеспечения", + "Объектно-ориентированное программирование", + "Функциональное программирование", + "Архитектура компьютеров", + "Цифровая обработка сигналов", + "Разработка мобильных приложений" + ]; + + private static readonly string[] _malePatronymics = + [ + "Иванович", + "Петрович", + "Сидорович", + "Алексеевич" + ]; + + private static readonly string[] _femalePatronymics = + [ + "Ивановна", + "Петровна", + "Сидоровна", + "Алексеевна" + ]; + + public static Course Generate(int id) + { + var faker = new Faker("ru") { Random = new Randomizer(id) }; + + var person = faker.Person; + var patronymic = person.Gender == Bogus.DataSets.Name.Gender.Male + ? faker.PickRandom(_malePatronymics) + : faker.PickRandom(_femalePatronymics); + + var maxStudents = faker.Random.Int(10, 100); + var currentStudents = faker.Random.Int(0, maxStudents); + + var startDateTime = faker.Date.Past(1); + var endDateTime = faker.Date.Future(1, startDateTime); + + return new Course + { + Id = id, + Name = faker.PickRandom(_courseNames), + TeacherFullName = $"{person.LastName} {person.FirstName} {patronymic}", + StartDate = DateOnly.FromDateTime(startDateTime), + EndDate = DateOnly.FromDateTime(endDateTime), + MaxStudents = maxStudents, + CurrentStudents = currentStudents, + HasCertificate = faker.Random.Bool(), + Cost = Math.Round(faker.Random.Decimal(0, 50000), 2), + Rating = faker.Random.Int(1, 5) + }; + } +} diff --git a/GenerationService/appsettings.Development.json b/GenerationService/appsettings.Development.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/GenerationService/appsettings.Development.json @@ -0,0 +1 @@ +{} diff --git a/GenerationService/appsettings.json b/GenerationService/appsettings.json new file mode 100644 index 00000000..abddb8ad --- /dev/null +++ b/GenerationService/appsettings.json @@ -0,0 +1,12 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "ConnectionStrings": { + "cache": "localhost:6379" + } +} diff --git a/ServiceDefaults/Extensions.cs b/ServiceDefaults/Extensions.cs index 40277400..19661d63 100644 --- a/ServiceDefaults/Extensions.cs +++ b/ServiceDefaults/Extensions.cs @@ -1,8 +1,8 @@ +using Microsoft.Extensions.Hosting; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Diagnostics.HealthChecks; -using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using OpenTelemetry; using OpenTelemetry.Metrics; @@ -12,7 +12,7 @@ namespace ServiceDefaults; public static class ServiceDefaultsExtensions { - public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder) + public static WebApplicationBuilder AddServiceDefaults(this WebApplicationBuilder builder) { builder.ConfigureOpenTelemetry(); builder.AddDefaultHealthChecks(); @@ -27,7 +27,7 @@ public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBu return builder; } - public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder) + public static WebApplicationBuilder ConfigureOpenTelemetry(this WebApplicationBuilder builder) { builder.Logging.AddOpenTelemetry(logging => { @@ -52,7 +52,7 @@ public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicati return builder; } - private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder) + private static WebApplicationBuilder AddOpenTelemetryExporters(this WebApplicationBuilder builder) { var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); if (useOtlpExporter) @@ -62,7 +62,7 @@ private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostAppli return builder; } - public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder) + public static WebApplicationBuilder AddDefaultHealthChecks(this WebApplicationBuilder builder) { builder.Services.AddHealthChecks() .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]); diff --git a/ServiceDefaults/ServiceDefaults.csproj b/ServiceDefaults/ServiceDefaults.csproj new file mode 100644 index 00000000..43f03f5f --- /dev/null +++ b/ServiceDefaults/ServiceDefaults.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + + From 3198009f5f0132b42d0b0615129c1562438cd9d3 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Tue, 3 Mar 2026 16:00:48 +0400 Subject: [PATCH 04/10] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppHost/Program.cs | 3 +- GenerationService/Models/Course.cs | 10 +-- GenerationService/Program.cs | 21 +++++-- GenerationService/Services/CourseGenerator.cs | 63 +++++++------------ GenerationService/appsettings.json | 9 +++ 5 files changed, 55 insertions(+), 51 deletions(-) diff --git a/AppHost/Program.cs b/AppHost/Program.cs index 517407f2..68b7b18c 100644 --- a/AppHost/Program.cs +++ b/AppHost/Program.cs @@ -1,6 +1,7 @@ var builder = DistributedApplication.CreateBuilder(args); -var cache = builder.AddRedis("cache"); +var cache = builder.AddRedis("cache") + .WithRedisInsight(); var generationService = builder.AddProject("generation-service") .WithReference(cache) diff --git a/GenerationService/Models/Course.cs b/GenerationService/Models/Course.cs index 9d9e7805..22ff9588 100644 --- a/GenerationService/Models/Course.cs +++ b/GenerationService/Models/Course.cs @@ -8,17 +8,17 @@ public class Course /// /// Уникальный идентификатор курса /// - public int Id { get; init; } + public int Id { get; set; } /// /// Название курса /// - public string Name { get; init; } = string.Empty; + public required string Name { get; init; } /// /// Полное имя преподавателя курса /// - public string TeacherFullName { get; init; } = string.Empty; + public required string TeacherFullName { get; init; } /// /// Дата начала курса @@ -33,12 +33,12 @@ public class Course /// /// Максимально допустимое количество студентов, которые могут быть зачислены на курс /// - public int MaxStudents { get; init; } + public int MaxCountStudents { get; init; } /// /// Текущее количество записанных студентов /// - public int CurrentStudents { get; init; } + public int CurrentCountStudents { get; init; } /// /// Выдаётся ли по окончании курса сертификат diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs index 72b9db12..577ed36a 100644 --- a/GenerationService/Program.cs +++ b/GenerationService/Program.cs @@ -11,15 +11,26 @@ builder.AddRedisDistributedCache("cache"); builder.Services.AddCors(options => - options.AddDefaultPolicy(policy => - policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod())); +{ + if (builder.Environment.IsDevelopment()) + { + options.AddDefaultPolicy(policy => + policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); + } + else + { + var allowedOrigins = builder.Configuration.GetSection("Cors:AllowedOrigins").Get() ?? []; + options.AddDefaultPolicy(policy => + policy.WithOrigins(allowedOrigins).AllowAnyHeader().AllowAnyMethod()); + } +}); var app = builder.Build(); app.UseCors(); app.MapDefaultEndpoints(); -app.MapGet("/course", async (int id, IDistributedCache cache, ILogger logger) => +app.MapGet("/course", async (int id, IDistributedCache cache, IConfiguration configuration, ILogger logger) => { if (id <= 0) return Results.BadRequest("Received invalid ID. ID must be a positive number"); @@ -40,12 +51,14 @@ logger.LogInformation("Cache miss for course with id {CourseId}, generating new data", id); var course = CourseGenerator.Generate(id); + var cacheExpirationMinutes = configuration.GetValue("Cache:ExpirationMinutes", 10); + await cache.SetStringAsync( cacheKey, JsonSerializer.Serialize(course), new DistributedCacheEntryOptions { - AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(10) + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(cacheExpirationMinutes) }); logger.LogInformation( diff --git a/GenerationService/Services/CourseGenerator.cs b/GenerationService/Services/CourseGenerator.cs index 53d8107a..efb3e566 100644 --- a/GenerationService/Services/CourseGenerator.cs +++ b/GenerationService/Services/CourseGenerator.cs @@ -29,49 +29,30 @@ public static class CourseGenerator "Разработка мобильных приложений" ]; - private static readonly string[] _malePatronymics = - [ - "Иванович", - "Петрович", - "Сидорович", - "Алексеевич" - ]; - - private static readonly string[] _femalePatronymics = - [ - "Ивановна", - "Петровна", - "Сидоровна", - "Алексеевна" - ]; + private static readonly Faker _faker = new Faker("ru") + .RuleFor(c => c.Id, f => 0) + .RuleFor(c => c.Name, f => f.PickRandom(_courseNames)) + .RuleFor(c => c.TeacherFullName, f => + { + var person = f.Person; + var patronymicBase = f.Name.FirstName(Bogus.DataSets.Name.Gender.Male); + var patronymic = person.Gender == Bogus.DataSets.Name.Gender.Male + ? $"{patronymicBase}ович" + : $"{patronymicBase}овна"; + return $"{person.LastName} {person.FirstName} {patronymic}"; + }) + .RuleFor(c => c.StartDate, f => DateOnly.FromDateTime(f.Date.Past(1))) + .RuleFor(c => c.EndDate, (f, c) => DateOnly.FromDateTime(f.Date.Future(1, c.StartDate.ToDateTime(TimeOnly.MinValue)))) + .RuleFor(c => c.MaxCountStudents, f => f.Random.Int(10, 100)) + .RuleFor(c => c.CurrentCountStudents, (f, c) => f.Random.Int(0, c.MaxCountStudents)) + .RuleFor(c => c.HasCertificate, f => f.Random.Bool()) + .RuleFor(c => c.Cost, f => Math.Round(f.Random.Decimal(0, 50000), 2)) + .RuleFor(c => c.Rating, f => f.Random.Int(1, 5)); public static Course Generate(int id) { - var faker = new Faker("ru") { Random = new Randomizer(id) }; - - var person = faker.Person; - var patronymic = person.Gender == Bogus.DataSets.Name.Gender.Male - ? faker.PickRandom(_malePatronymics) - : faker.PickRandom(_femalePatronymics); - - var maxStudents = faker.Random.Int(10, 100); - var currentStudents = faker.Random.Int(0, maxStudents); - - var startDateTime = faker.Date.Past(1); - var endDateTime = faker.Date.Future(1, startDateTime); - - return new Course - { - Id = id, - Name = faker.PickRandom(_courseNames), - TeacherFullName = $"{person.LastName} {person.FirstName} {patronymic}", - StartDate = DateOnly.FromDateTime(startDateTime), - EndDate = DateOnly.FromDateTime(endDateTime), - MaxStudents = maxStudents, - CurrentStudents = currentStudents, - HasCertificate = faker.Random.Bool(), - Cost = Math.Round(faker.Random.Decimal(0, 50000), 2), - Rating = faker.Random.Int(1, 5) - }; + var course = _faker.Generate(); + course.Id = id; + return course; } } diff --git a/GenerationService/appsettings.json b/GenerationService/appsettings.json index abddb8ad..dee2e657 100644 --- a/GenerationService/appsettings.json +++ b/GenerationService/appsettings.json @@ -8,5 +8,14 @@ "AllowedHosts": "*", "ConnectionStrings": { "cache": "localhost:6379" + }, + "Cors": { + "AllowedOrigins": [ + "https://example.com", + "https://api.example.com" + ] + }, + "Cache": { + "ExpirationMinutes": 10 } } From 627de3ab20a655da88ee1174dcefe8622eeb39e1 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Thu, 5 Mar 2026 16:48:57 +0400 Subject: [PATCH 05/10] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D1=83=D1=8E=20=D0=BB=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D0=BE=D1=80=D0=BD=D1=83=D1=8E=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApiGateway/ApiGateway.csproj | 23 +++++++++++ ApiGateway/NoServicesAvailableError.cs | 7 ++++ ApiGateway/Program.cs | 42 +++++++++++++++++++ ApiGateway/Properties/launchSettings.json | 38 +++++++++++++++++ ApiGateway/QueryBasedLoadBalancer.cs | 47 ++++++++++++++++++++++ ApiGateway/appsettings.Development.json | 8 ++++ ApiGateway/appsettings.json | 15 +++++++ ApiGateway/ocelot.json | 28 +++++++++++++ AppHost/AppHost.csproj | 3 +- AppHost/Program.cs | 23 ++++++++++- Client.Wasm/Components/StudentCard.razor | 2 +- Client.Wasm/wwwroot/appsettings.json | 2 +- CloudDevelopment.sln | 18 ++++++++- GenerationService/Program.cs | 4 +- README.md | 25 +++++++----- image-1.png | Bin 0 -> 79732 bytes image-2.png | Bin 0 -> 54549 bytes image.png | Bin 0 -> 60737 bytes 18 files changed, 265 insertions(+), 20 deletions(-) create mode 100644 ApiGateway/ApiGateway.csproj create mode 100644 ApiGateway/NoServicesAvailableError.cs create mode 100644 ApiGateway/Program.cs create mode 100644 ApiGateway/Properties/launchSettings.json create mode 100644 ApiGateway/QueryBasedLoadBalancer.cs create mode 100644 ApiGateway/appsettings.Development.json create mode 100644 ApiGateway/appsettings.json create mode 100644 ApiGateway/ocelot.json create mode 100644 image-1.png create mode 100644 image-2.png create mode 100644 image.png diff --git a/ApiGateway/ApiGateway.csproj b/ApiGateway/ApiGateway.csproj new file mode 100644 index 00000000..61ea778f --- /dev/null +++ b/ApiGateway/ApiGateway.csproj @@ -0,0 +1,23 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/ApiGateway/NoServicesAvailableError.cs b/ApiGateway/NoServicesAvailableError.cs new file mode 100644 index 00000000..11eeec20 --- /dev/null +++ b/ApiGateway/NoServicesAvailableError.cs @@ -0,0 +1,7 @@ +using Ocelot.Errors; + +namespace ApiGateway; + +public class NoServicesAvailableError(string message) : Error(message, OcelotErrorCode.UnknownError, 503) +{ +} diff --git a/ApiGateway/Program.cs b/ApiGateway/Program.cs new file mode 100644 index 00000000..f6be0fce --- /dev/null +++ b/ApiGateway/Program.cs @@ -0,0 +1,42 @@ +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using ServiceDefaults; +using ApiGateway; + +var builder = WebApplication.CreateBuilder(args); + +builder.AddServiceDefaults(); + +builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true); + +builder.Services.AddCors(options => +{ + if (builder.Environment.IsDevelopment()) + { + options.AddDefaultPolicy(policy => + policy.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); + } + else + { + var allowedOrigins = builder.Configuration.GetSection("Cors:AllowedOrigins").Get() ?? []; + options.AddDefaultPolicy(policy => + policy.WithOrigins(allowedOrigins).AllowAnyHeader().AllowAnyMethod()); + } +}); + +builder.Services + .AddOcelot(builder.Configuration) + .AddCustomLoadBalancer((serviceProvider, route, serviceDiscoveryProvider) => + { + return new QueryBasedLoadBalancer(serviceDiscoveryProvider.GetAsync); + }); + +var app = builder.Build(); + +app.UseCors(); +app.MapDefaultEndpoints(); + +await app.UseOcelot(); + +app.Run(); + diff --git a/ApiGateway/Properties/launchSettings.json b/ApiGateway/Properties/launchSettings.json new file mode 100644 index 00000000..75e3489d --- /dev/null +++ b/ApiGateway/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:7138", + "sslPort": 44326 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:5067", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "https://localhost:7022;http://localhost:5067", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": false, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/ApiGateway/QueryBasedLoadBalancer.cs b/ApiGateway/QueryBasedLoadBalancer.cs new file mode 100644 index 00000000..3cb88348 --- /dev/null +++ b/ApiGateway/QueryBasedLoadBalancer.cs @@ -0,0 +1,47 @@ +using Ocelot.LoadBalancer.Interfaces; +using Ocelot.Responses; +using Ocelot.Values; + +namespace ApiGateway; + +public class QueryBasedLoadBalancer : ILoadBalancer +{ + private readonly Func>> _services; + + public QueryBasedLoadBalancer() + { + _services = () => Task.FromResult(new List()); + } + + public QueryBasedLoadBalancer(Func>> services) + { + _services = services; + } + + public string Type => nameof(QueryBasedLoadBalancer); + + public void Release(ServiceHostAndPort hostAndPort) { } + + public async Task> LeaseAsync(HttpContext httpContext) + { + var services = await _services(); + + if (services == null || services.Count == 0) + { + return new ErrorResponse( + new NoServicesAvailableError("No services available for load balancing")); + } + + if (!httpContext.Request.Query.TryGetValue("id", out var idValues) + || !int.TryParse(idValues.FirstOrDefault(), out var id)) + { + var firstService = services[0]; + return new OkResponse(firstService.HostAndPort); + } + + var replicaIndex = id % services.Count; + var selectedService = services[replicaIndex]; + + return new OkResponse(selectedService.HostAndPort); + } +} diff --git a/ApiGateway/appsettings.Development.json b/ApiGateway/appsettings.Development.json new file mode 100644 index 00000000..0c208ae9 --- /dev/null +++ b/ApiGateway/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/ApiGateway/appsettings.json b/ApiGateway/appsettings.json new file mode 100644 index 00000000..2a49fbd3 --- /dev/null +++ b/ApiGateway/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "Cors": { + "AllowedOrigins": [ + "https://example.com", + "https://api.example.com" + ] + } +} diff --git a/ApiGateway/ocelot.json b/ApiGateway/ocelot.json new file mode 100644 index 00000000..8449c953 --- /dev/null +++ b/ApiGateway/ocelot.json @@ -0,0 +1,28 @@ +{ + "Routes": [ + { + "DownstreamPathTemplate": "/course", + "DownstreamScheme": "http", + "UpstreamPathTemplate": "/course", + "UpstreamHttpMethod": [ "Get" ], + "DownstreamHostAndPorts": [ + { + "Host": "localhost", + "Port": 5000 + }, + { + "Host": "localhost", + "Port": 5001 + }, + { + "Host": "localhost", + "Port": 5002 + } + ], + "LoadBalancerOptions": { + "Type": "QueryBasedLoadBalancer" + } + } + ], + "GlobalConfiguration": {} +} diff --git a/AppHost/AppHost.csproj b/AppHost/AppHost.csproj index 5ad35926..dde99fb2 100644 --- a/AppHost/AppHost.csproj +++ b/AppHost/AppHost.csproj @@ -1,4 +1,4 @@ - + @@ -15,6 +15,7 @@ + diff --git a/AppHost/Program.cs b/AppHost/Program.cs index 68b7b18c..a110bb08 100644 --- a/AppHost/Program.cs +++ b/AppHost/Program.cs @@ -3,12 +3,31 @@ var cache = builder.AddRedis("cache") .WithRedisInsight(); -var generationService = builder.AddProject("generation-service") +var generationService0 = builder.AddProject("generation-service-0") .WithReference(cache) + .WithEndpoint("http", endpoint => endpoint.Port = 5000) .WaitFor(cache); +var generationService1 = builder.AddProject("generation-service-1") + .WithReference(cache) + .WithEndpoint("http", endpoint => endpoint.Port = 5001) + .WaitFor(cache); + +var generationService2 = builder.AddProject("generation-service-2") + .WithReference(cache) + .WithEndpoint("http", endpoint => endpoint.Port = 5002) + .WaitFor(cache); + +var apiGateway = builder.AddProject("api-gateway") + .WithEndpoint("http", endpoint => endpoint.Port = 5100) + .WithExternalHttpEndpoints() + .WaitFor(generationService0) + .WaitFor(generationService1) + .WaitFor(generationService2); + builder.AddProject("client-wasm") .WithExternalHttpEndpoints() - .WaitFor(generationService); + .WithReference(apiGateway) + .WaitFor(apiGateway); builder.Build().Run(); diff --git a/Client.Wasm/Components/StudentCard.razor b/Client.Wasm/Components/StudentCard.razor index beaf9f05..52793e35 100644 --- a/Client.Wasm/Components/StudentCard.razor +++ b/Client.Wasm/Components/StudentCard.razor @@ -4,7 +4,7 @@ - Номер №1 "Кэширование" + Номер №2 "Балансировка нагрузки" Вариант №12 "Учебный курс" Выполнена Прибыловым Александром 6511 Ссылка на форк diff --git a/Client.Wasm/wwwroot/appsettings.json b/Client.Wasm/wwwroot/appsettings.json index 82d75124..51241638 100644 --- a/Client.Wasm/wwwroot/appsettings.json +++ b/Client.Wasm/wwwroot/appsettings.json @@ -6,5 +6,5 @@ } }, "AllowedHosts": "*", - "BaseAddress": "http://localhost:5134/course" + "BaseAddress": "http://localhost:5100/course" } \ No newline at end of file diff --git a/CloudDevelopment.sln b/CloudDevelopment.sln index 65c35637..2c4dd7fb 100644 --- a/CloudDevelopment.sln +++ b/CloudDevelopment.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.14.36811.4 +# Visual Studio Version 18 +VisualStudioVersion = 18.3.11520.95 d18.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Wasm", "Client.Wasm\Client.Wasm.csproj", "{AE7EEA74-2FE0-136F-D797-854FD87E022A}" EndProject @@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenerationService", "Genera EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppHost", "AppHost\AppHost.csproj", "{916C4526-14E2-484A-AD98-72F31B11CA7B}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiGateway", "ApiGateway\ApiGateway.csproj", "{ABE66B30-BD47-A7B2-B17B-5BA67959B026}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -69,6 +71,18 @@ Global {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x64.Build.0 = Release|Any CPU {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x86.ActiveCfg = Release|Any CPU {916C4526-14E2-484A-AD98-72F31B11CA7B}.Release|x86.Build.0 = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|x64.ActiveCfg = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|x64.Build.0 = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|x86.ActiveCfg = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Debug|x86.Build.0 = Debug|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|Any CPU.Build.0 = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x64.ActiveCfg = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x64.Build.0 = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x86.ActiveCfg = Release|Any CPU + {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs index 577ed36a..fac723ac 100644 --- a/GenerationService/Program.cs +++ b/GenerationService/Program.cs @@ -32,8 +32,8 @@ app.MapGet("/course", async (int id, IDistributedCache cache, IConfiguration configuration, ILogger logger) => { - if (id <= 0) - return Results.BadRequest("Received invalid ID. ID must be a positive number"); + if (id < 0) + return Results.BadRequest("Received invalid ID. ID must be a non-negative number"); var cacheKey = $"course:{id}"; diff --git a/README.md b/README.md index 0807a539..dba9e9e2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -## Цель лабораторной работы -Реализация минимального микросервисного бэкенда с кэшированием +## Цель лабораторной работы №2 +Реализация API Gateway на основе Ocelot с кастомным алгоритмом балансировки нагрузки Query Based. ## Технологии и требования @@ -7,19 +7,22 @@ - Redis - Bogus +### Вариант №12 +- **Доменная область**: Учебный курс +- **Алгоритм балансировки**: Query Based + ## Что я сделал в проекте -В рамках этой лабораторной работы реализовано и настроено следующее: +Реализован API Gateway с кастомным алгоритмом балансировки нагрузки Query Based, который: +- Обеспечивает детерминированное распределение запросов по репликам на основе параметра `id` +- Интегрирован с Aspire для удобной оркестрации и мониторинга +- Поддерживает масштабирование через изменение количества реплик +- Использует Redis для кэширования и уменьшения нагрузки на генерацию данных -- HTTP-эндпоинт `GET /course?id={id}` в сервисе `GenerationService`, возвращающий DTO `Course`. -- Механизм генерации данных курсов (используется Bogus)., -- Кэширование ответов через `IDistributedCache` с провайдером Redis: ключи `course:{id}`, TTL 10 минут. -- Набор расширений `ServiceDefaults` для единообразной конфигурации сервисов: OpenTelemetry (метрики/трейсы), health checks и настройки `HttpClient`. +![alt text](image.png) +![alt text](image-1.png) +![alt text](image-2.png) -Снимок экрана 2026-02-19 162728 -Снимок экрана 2026-02-19 162815 -Снимок экрана 2026-02-19 162752 -Снимок экрана 2026-02-19 162917 diff --git a/image-1.png b/image-1.png new file mode 100644 index 0000000000000000000000000000000000000000..63eae1eeaec631c0478c836abda4a5adc99a578b GIT binary patch literal 79732 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 z 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 Kn41T3Bgxh#)4>mGM4tXz3|8 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 literal 0 HcmV?d00001 diff --git a/image-2.png b/image-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7d06ea05d25108f6b0f3bdd46ecbe52a94e96517 GIT binary patch literal 54549 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%0DbwyJXa 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 literal 0 HcmV?d00001 From 24528af60816c2948c698c5d8d1f74dbbfd5ab83 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Wed, 11 Mar 2026 19:44:43 +0400 Subject: [PATCH 06/10] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8,=20=D0=B7=D0=B0=D1=85?= =?UTF-8?q?=D0=B0=D1=80=D0=B4=D0=BA=D0=BE=D0=B6=D0=B5=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D1=80=D1=82=D1=8B=20=D1=83=D0=B1=D1=80?= =?UTF-8?q?=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ApiGateway/ApiGateway.csproj | 6 --- ApiGateway/NoServicesAvailableError.cs | 4 +- ApiGateway/OcelotConfigurationService.cs | 55 ++++++++++++++++++++++++ ApiGateway/Program.cs | 16 +++++-- ApiGateway/QueryBasedLoadBalancer.cs | 24 +++-------- ApiGateway/ocelot.json | 28 ------------ AppHost/Program.cs | 32 +++++++------- 7 files changed, 90 insertions(+), 75 deletions(-) create mode 100644 ApiGateway/OcelotConfigurationService.cs delete mode 100644 ApiGateway/ocelot.json diff --git a/ApiGateway/ApiGateway.csproj b/ApiGateway/ApiGateway.csproj index 61ea778f..81de19e1 100644 --- a/ApiGateway/ApiGateway.csproj +++ b/ApiGateway/ApiGateway.csproj @@ -14,10 +14,4 @@ - - - PreserveNewest - - - diff --git a/ApiGateway/NoServicesAvailableError.cs b/ApiGateway/NoServicesAvailableError.cs index 11eeec20..a4d4cbdb 100644 --- a/ApiGateway/NoServicesAvailableError.cs +++ b/ApiGateway/NoServicesAvailableError.cs @@ -2,6 +2,4 @@ namespace ApiGateway; -public class NoServicesAvailableError(string message) : Error(message, OcelotErrorCode.UnknownError, 503) -{ -} +public class NoServicesAvailableError(string message) : Error(message, OcelotErrorCode.UnknownError, 503) { } diff --git a/ApiGateway/OcelotConfigurationService.cs b/ApiGateway/OcelotConfigurationService.cs new file mode 100644 index 00000000..ab1bfd70 --- /dev/null +++ b/ApiGateway/OcelotConfigurationService.cs @@ -0,0 +1,55 @@ +using Ocelot.Configuration.File; + +namespace ApiGateway; + +public class OcelotConfigurationService(IConfiguration configuration) +{ + private readonly IConfiguration _configuration = configuration; + + public FileConfiguration BuildConfiguration() + { + var downstreamHostAndPorts = new List(); + var servicesSection = _configuration.GetSection("services"); + var index = 0; + + while (true) + { + var serviceName = $"generation-service-{index}"; + var serviceUrl = servicesSection[$"{serviceName}:http:0"]; + + if (string.IsNullOrEmpty(serviceUrl)) + break; + + if (Uri.TryCreate(serviceUrl, UriKind.Absolute, out var uri)) + { + downstreamHostAndPorts.Add(new FileHostAndPort + { + Host = uri.Host, + Port = uri.Port + }); + } + + index++; + } + + return new FileConfiguration + { + Routes = + [ + new FileRoute + { + DownstreamPathTemplate = "/course", + DownstreamScheme = "http", + UpstreamPathTemplate = "/course", + UpstreamHttpMethod = ["Get"], + DownstreamHostAndPorts = downstreamHostAndPorts, + LoadBalancerOptions = new FileLoadBalancerOptions + { + Type = nameof(QueryBasedLoadBalancer) + } + } + ], + GlobalConfiguration = new FileGlobalConfiguration() + }; + } +} diff --git a/ApiGateway/Program.cs b/ApiGateway/Program.cs index f6be0fce..e82ff462 100644 --- a/ApiGateway/Program.cs +++ b/ApiGateway/Program.cs @@ -1,14 +1,13 @@ +using ApiGateway; +using Ocelot.Configuration.File; using Ocelot.DependencyInjection; using Ocelot.Middleware; using ServiceDefaults; -using ApiGateway; var builder = WebApplication.CreateBuilder(args); builder.AddServiceDefaults(); -builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true); - builder.Services.AddCors(options => { if (builder.Environment.IsDevelopment()) @@ -24,8 +23,17 @@ } }); +var ocelotConfigService = new OcelotConfigurationService(builder.Configuration); +var ocelotConfig = ocelotConfigService.BuildConfiguration(); + +builder.Services.Configure(config => +{ + config.Routes = ocelotConfig.Routes; + config.GlobalConfiguration = ocelotConfig.GlobalConfiguration; +}); + builder.Services - .AddOcelot(builder.Configuration) + .AddOcelot() .AddCustomLoadBalancer((serviceProvider, route, serviceDiscoveryProvider) => { return new QueryBasedLoadBalancer(serviceDiscoveryProvider.GetAsync); diff --git a/ApiGateway/QueryBasedLoadBalancer.cs b/ApiGateway/QueryBasedLoadBalancer.cs index 3cb88348..a13749ae 100644 --- a/ApiGateway/QueryBasedLoadBalancer.cs +++ b/ApiGateway/QueryBasedLoadBalancer.cs @@ -4,29 +4,17 @@ namespace ApiGateway; -public class QueryBasedLoadBalancer : ILoadBalancer +public class QueryBasedLoadBalancer(Func>> services) : ILoadBalancer { - private readonly Func>> _services; - - public QueryBasedLoadBalancer() - { - _services = () => Task.FromResult(new List()); - } - - public QueryBasedLoadBalancer(Func>> services) - { - _services = services; - } - public string Type => nameof(QueryBasedLoadBalancer); public void Release(ServiceHostAndPort hostAndPort) { } public async Task> LeaseAsync(HttpContext httpContext) { - var services = await _services(); + var servicesList = await services(); - if (services == null || services.Count == 0) + if (servicesList == null || servicesList.Count == 0) { return new ErrorResponse( new NoServicesAvailableError("No services available for load balancing")); @@ -35,12 +23,12 @@ public async Task> LeaseAsync(HttpContext httpConte if (!httpContext.Request.Query.TryGetValue("id", out var idValues) || !int.TryParse(idValues.FirstOrDefault(), out var id)) { - var firstService = services[0]; + var firstService = servicesList[0]; return new OkResponse(firstService.HostAndPort); } - var replicaIndex = id % services.Count; - var selectedService = services[replicaIndex]; + var replicaIndex = id % servicesList.Count; + var selectedService = servicesList[replicaIndex]; return new OkResponse(selectedService.HostAndPort); } diff --git a/ApiGateway/ocelot.json b/ApiGateway/ocelot.json deleted file mode 100644 index 8449c953..00000000 --- a/ApiGateway/ocelot.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "Routes": [ - { - "DownstreamPathTemplate": "/course", - "DownstreamScheme": "http", - "UpstreamPathTemplate": "/course", - "UpstreamHttpMethod": [ "Get" ], - "DownstreamHostAndPorts": [ - { - "Host": "localhost", - "Port": 5000 - }, - { - "Host": "localhost", - "Port": 5001 - }, - { - "Host": "localhost", - "Port": 5002 - } - ], - "LoadBalancerOptions": { - "Type": "QueryBasedLoadBalancer" - } - } - ], - "GlobalConfiguration": {} -} diff --git a/AppHost/Program.cs b/AppHost/Program.cs index a110bb08..5efdb3ee 100644 --- a/AppHost/Program.cs +++ b/AppHost/Program.cs @@ -3,27 +3,27 @@ var cache = builder.AddRedis("cache") .WithRedisInsight(); -var generationService0 = builder.AddProject("generation-service-0") - .WithReference(cache) - .WithEndpoint("http", endpoint => endpoint.Port = 5000) - .WaitFor(cache); +const int replicaCount = 3; +var generationServices = new List>(); -var generationService1 = builder.AddProject("generation-service-1") - .WithReference(cache) - .WithEndpoint("http", endpoint => endpoint.Port = 5001) - .WaitFor(cache); +for (var i = 0; i < replicaCount; i++) +{ + var service = builder.AddProject($"generation-service-{i}") + .WithReference(cache) + .WithEndpoint("http", endpoint => endpoint.Port = 5000 + i) + .WaitFor(cache); -var generationService2 = builder.AddProject("generation-service-2") - .WithReference(cache) - .WithEndpoint("http", endpoint => endpoint.Port = 5002) - .WaitFor(cache); + generationServices.Add(service); +} var apiGateway = builder.AddProject("api-gateway") .WithEndpoint("http", endpoint => endpoint.Port = 5100) - .WithExternalHttpEndpoints() - .WaitFor(generationService0) - .WaitFor(generationService1) - .WaitFor(generationService2); + .WithExternalHttpEndpoints(); + +foreach (var service in generationServices) +{ + apiGateway = apiGateway.WithReference(service).WaitFor(service); +} builder.AddProject("client-wasm") .WithExternalHttpEndpoints() From 2b10c94f61111173456845ed2bc374c98c1f625b Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Wed, 25 Mar 2026 11:14:08 +0400 Subject: [PATCH 07/10] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=203-?= =?UTF-8?q?=D1=8E=20=D0=9B/=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppHost/AppHost.csproj | 1 + AppHost/Program.cs | 24 ++- Client.Wasm/Components/StudentCard.razor | 2 +- CloudDevelopment.sln | 32 ++- File.Service/CourseMessage.cs | 14 ++ File.Service/File.Service.csproj | 18 ++ File.Service/Program.cs | 62 ++++++ File.Service/Properties/launchSettings.json | 38 ++++ File.Service/Services/CourseConsumer.cs | 34 ++++ File.Service/Services/MinioInitializer.cs | 32 +++ File.Service/Services/SqsReadinessService.cs | 36 ++++ File.Service/appsettings.Development.json | 8 + File.Service/appsettings.json | 9 + GenerationService/CourseMessage.cs | 14 ++ GenerationService/GenerationService.csproj | 5 +- GenerationService/Program.cs | 68 ++++++- Test.Service/AppHostFixture.cs | 85 ++++++++ Test.Service/IntegrationTests.cs | 202 +++++++++++++++++++ Test.Service/Test.Service.csproj | 31 +++ 19 files changed, 703 insertions(+), 12 deletions(-) create mode 100644 File.Service/CourseMessage.cs create mode 100644 File.Service/File.Service.csproj create mode 100644 File.Service/Program.cs create mode 100644 File.Service/Properties/launchSettings.json create mode 100644 File.Service/Services/CourseConsumer.cs create mode 100644 File.Service/Services/MinioInitializer.cs create mode 100644 File.Service/Services/SqsReadinessService.cs create mode 100644 File.Service/appsettings.Development.json create mode 100644 File.Service/appsettings.json create mode 100644 GenerationService/CourseMessage.cs create mode 100644 Test.Service/AppHostFixture.cs create mode 100644 Test.Service/IntegrationTests.cs create mode 100644 Test.Service/Test.Service.csproj diff --git a/AppHost/AppHost.csproj b/AppHost/AppHost.csproj index dde99fb2..c0a16a69 100644 --- a/AppHost/AppHost.csproj +++ b/AppHost/AppHost.csproj @@ -17,6 +17,7 @@ + diff --git a/AppHost/Program.cs b/AppHost/Program.cs index 5efdb3ee..1cf5664c 100644 --- a/AppHost/Program.cs +++ b/AppHost/Program.cs @@ -3,6 +3,18 @@ var cache = builder.AddRedis("cache") .WithRedisInsight(); +var minio = builder.AddContainer("minio", "minio/minio") + .WithArgs("server", "/data", "--console-address", ":9001") + .WithEnvironment("MINIO_ROOT_USER", "minioadmin") + .WithEnvironment("MINIO_ROOT_PASSWORD", "minioadmin") + .WithHttpEndpoint(targetPort: 9000, name: "api") + .WithHttpEndpoint(targetPort: 9001, name: "console") + .WithHttpHealthCheck("/minio/health/live", endpointName: "api"); + +var sqs = builder.AddContainer("elasticmq", "softwaremill/elasticmq-native") + .WithHttpEndpoint(targetPort: 9324, name: "http") + .WithHttpHealthCheck("/?Action=ListQueues", endpointName: "http"); + const int replicaCount = 3; var generationServices = new List>(); @@ -11,11 +23,21 @@ var service = builder.AddProject($"generation-service-{i}") .WithReference(cache) .WithEndpoint("http", endpoint => endpoint.Port = 5000 + i) - .WaitFor(cache); + .WaitFor(cache) + .WithEnvironment("Sqs__ServiceUrl", sqs.GetEndpoint("http")) + .WaitFor(sqs); generationServices.Add(service); } +var fileService = builder.AddProject("file-service") + .WithEnvironment("Sqs__ServiceUrl", sqs.GetEndpoint("http")) + .WithEnvironment("Minio__ServiceUrl", minio.GetEndpoint("api")) + .WithEnvironment("Minio__AccessKey", "minioadmin") + .WithEnvironment("Minio__SecretKey", "minioadmin") + .WaitFor(sqs) + .WaitFor(minio); + var apiGateway = builder.AddProject("api-gateway") .WithEndpoint("http", endpoint => endpoint.Port = 5100) .WithExternalHttpEndpoints(); diff --git a/Client.Wasm/Components/StudentCard.razor b/Client.Wasm/Components/StudentCard.razor index 52793e35..1061aa7c 100644 --- a/Client.Wasm/Components/StudentCard.razor +++ b/Client.Wasm/Components/StudentCard.razor @@ -4,7 +4,7 @@ - Номер №2 "Балансировка нагрузки" + Номер №3 "Интеграционное Тестирование" Вариант №12 "Учебный курс" Выполнена Прибыловым Александром 6511 Ссылка на форк diff --git a/CloudDevelopment.sln b/CloudDevelopment.sln index 2c4dd7fb..134a6fc0 100644 --- a/CloudDevelopment.sln +++ b/CloudDevelopment.sln @@ -1,7 +1,7 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.3.11520.95 d18.3 +VisualStudioVersion = 18.3.11520.95 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Wasm", "Client.Wasm\Client.Wasm.csproj", "{AE7EEA74-2FE0-136F-D797-854FD87E022A}" EndProject @@ -13,6 +13,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppHost", "AppHost\AppHost. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ApiGateway", "ApiGateway\ApiGateway.csproj", "{ABE66B30-BD47-A7B2-B17B-5BA67959B026}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "File.Service", "File.Service\File.Service.csproj", "{DF944664-05C9-E01F-B262-C8B381C1EFE1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Service", "Test.Service\Test.Service.csproj", "{3C5DCB26-5296-4A7C-93E7-F4511E16C94B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -83,6 +87,30 @@ Global {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x64.Build.0 = Release|Any CPU {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x86.ActiveCfg = Release|Any CPU {ABE66B30-BD47-A7B2-B17B-5BA67959B026}.Release|x86.Build.0 = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|x64.ActiveCfg = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|x64.Build.0 = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|x86.ActiveCfg = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Debug|x86.Build.0 = Debug|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|Any CPU.Build.0 = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|x64.ActiveCfg = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|x64.Build.0 = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|x86.ActiveCfg = Release|Any CPU + {DF944664-05C9-E01F-B262-C8B381C1EFE1}.Release|x86.Build.0 = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|x64.ActiveCfg = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|x64.Build.0 = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|x86.ActiveCfg = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Debug|x86.Build.0 = Debug|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|Any CPU.Build.0 = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|x64.ActiveCfg = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|x64.Build.0 = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|x86.ActiveCfg = Release|Any CPU + {3C5DCB26-5296-4A7C-93E7-F4511E16C94B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/File.Service/CourseMessage.cs b/File.Service/CourseMessage.cs new file mode 100644 index 00000000..b4ea9af0 --- /dev/null +++ b/File.Service/CourseMessage.cs @@ -0,0 +1,14 @@ +namespace File.Service; + +public record CourseMessage( + int Id, + string Name, + string TeacherFullName, + DateOnly StartDate, + DateOnly EndDate, + int MaxCountStudents, + int CurrentCountStudents, + bool HasCertificate, + decimal Cost, + int Rating +); diff --git a/File.Service/File.Service.csproj b/File.Service/File.Service.csproj new file mode 100644 index 00000000..2b45621a --- /dev/null +++ b/File.Service/File.Service.csproj @@ -0,0 +1,18 @@ + + + + net8.0 + enable + enable + + + + + + + + + + + + diff --git a/File.Service/Program.cs b/File.Service/Program.cs new file mode 100644 index 00000000..3c585149 --- /dev/null +++ b/File.Service/Program.cs @@ -0,0 +1,62 @@ +using Amazon.Runtime; +using Amazon.S3; +using Amazon.SQS; +using File.Service.Services; +using MassTransit; +using ServiceDefaults; + +var builder = WebApplication.CreateBuilder(args); + +builder.AddServiceDefaults(); + +var minioServiceUrl = builder.Configuration["Minio:ServiceUrl"] ?? "http://localhost:9000"; +var minioAccessKey = builder.Configuration["Minio:AccessKey"] ?? "minioadmin"; +var minioSecretKey = builder.Configuration["Minio:SecretKey"] ?? "minioadmin"; + +builder.Services.AddSingleton(_ => new AmazonS3Client( + new BasicAWSCredentials(minioAccessKey, minioSecretKey), + new AmazonS3Config + { + ServiceURL = minioServiceUrl, + ForcePathStyle = true, + AuthenticationRegion = "us-east-1" + } +)); + +var sqsServiceUrl = builder.Configuration["Sqs:ServiceUrl"] ?? "http://localhost:9324"; + +builder.Services.AddHostedService(); + +builder.Services.AddMassTransit(x => +{ + x.AddConsumer(); + + x.UsingAmazonSqs((context, cfg) => + { + cfg.Host("us-east-1", h => + { + h.AccessKey("test"); + h.SecretKey("test"); + h.Config(new AmazonSQSConfig + { + ServiceURL = sqsServiceUrl, + AuthenticationRegion = "us-east-1" + }); + }); + + cfg.ReceiveEndpoint("courses", e => + { + e.ConfigureConsumeTopology = false; + e.UseRawJsonDeserializer(RawSerializerOptions.AnyMessageType); + e.Consumer(context); + }); + }); +}); + +builder.Services.AddHostedService(); + +var app = builder.Build(); + +app.MapDefaultEndpoints(); + +app.Run(); diff --git a/File.Service/Properties/launchSettings.json b/File.Service/Properties/launchSettings.json new file mode 100644 index 00000000..a8e8b680 --- /dev/null +++ b/File.Service/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:33999", + "sslPort": 44388 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7148;http://localhost:5207", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/File.Service/Services/CourseConsumer.cs b/File.Service/Services/CourseConsumer.cs new file mode 100644 index 00000000..f9841add --- /dev/null +++ b/File.Service/Services/CourseConsumer.cs @@ -0,0 +1,34 @@ +using Amazon.S3; +using Amazon.S3.Model; +using MassTransit; +using System.Text.Json; + +namespace File.Service.Services; + +public class CourseConsumer( + IAmazonS3 s3Client, + ILogger logger) : IConsumer +{ + private const string BucketName = "courses"; + private static readonly JsonSerializerOptions _jsonOptions = new() + { + PropertyNamingPolicy = JsonNamingPolicy.CamelCase + }; + + public async Task Consume(ConsumeContext context) + { + var course = context.Message; + var fileName = $"course-{course.Id}.json"; + var json = JsonSerializer.Serialize(course, _jsonOptions); + + await s3Client.PutObjectAsync(new PutObjectRequest + { + BucketName = BucketName, + Key = fileName, + ContentBody = json, + ContentType = "application/json" + }, context.CancellationToken); + + logger.LogInformation("Saved course {CourseId} to Minio as {FileName}", course.Id, fileName); + } +} diff --git a/File.Service/Services/MinioInitializer.cs b/File.Service/Services/MinioInitializer.cs new file mode 100644 index 00000000..c0039fa5 --- /dev/null +++ b/File.Service/Services/MinioInitializer.cs @@ -0,0 +1,32 @@ +using Amazon.S3; +using Amazon.S3.Model; + +namespace File.Service.Services; + +public class MinioInitializer(IAmazonS3 s3Client, ILogger logger) : BackgroundService +{ + private const string BucketName = "courses"; + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + try + { + await s3Client.PutBucketAsync(new PutBucketRequest { BucketName = BucketName }, stoppingToken); + logger.LogInformation("Minio bucket '{BucketName}' ready", BucketName); + return; + } + catch (AmazonS3Exception ex) when (ex.StatusCode == System.Net.HttpStatusCode.Conflict) + { + logger.LogInformation("Minio bucket '{BucketName}' already exists", BucketName); + return; + } + catch (Exception ex) when (!stoppingToken.IsCancellationRequested) + { + logger.LogWarning(ex, "Failed to initialize Minio bucket, retrying in 3 seconds..."); + await Task.Delay(TimeSpan.FromSeconds(3), stoppingToken); + } + } + } +} diff --git a/File.Service/Services/SqsReadinessService.cs b/File.Service/Services/SqsReadinessService.cs new file mode 100644 index 00000000..180644ed --- /dev/null +++ b/File.Service/Services/SqsReadinessService.cs @@ -0,0 +1,36 @@ +namespace File.Service.Services; + +/// +/// Ожидает готовности SQS-эндпоинта до старта MassTransit. +/// Регистрируется первым, чтобы MassTransit не упал при подключении к ещё не запущенному ElasticMQ. +/// +public class SqsReadinessService(IConfiguration configuration, ILogger logger) : IHostedService +{ + public async Task StartAsync(CancellationToken cancellationToken) + { + var sqsUrl = configuration["Sqs:ServiceUrl"] ?? "http://localhost:9324"; + + using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5) }; + + var deadline = DateTime.UtcNow.AddMinutes(2); + + while (DateTime.UtcNow < deadline && !cancellationToken.IsCancellationRequested) + { + try + { + await httpClient.GetAsync($"{sqsUrl}/?Action=ListQueues", cancellationToken); + logger.LogInformation("SQS is ready at {Url}", sqsUrl); + return; + } + catch (Exception ex) when (!cancellationToken.IsCancellationRequested) + { + logger.LogWarning(ex, "SQS not ready at {Url}, retrying in 2 seconds...", sqsUrl); + await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken); + } + } + + logger.LogError("SQS did not become ready within the timeout"); + } + + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; +} diff --git a/File.Service/appsettings.Development.json b/File.Service/appsettings.Development.json new file mode 100644 index 00000000..0c208ae9 --- /dev/null +++ b/File.Service/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/File.Service/appsettings.json b/File.Service/appsettings.json new file mode 100644 index 00000000..10f68b8c --- /dev/null +++ b/File.Service/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/GenerationService/CourseMessage.cs b/GenerationService/CourseMessage.cs new file mode 100644 index 00000000..24f5cd9e --- /dev/null +++ b/GenerationService/CourseMessage.cs @@ -0,0 +1,14 @@ +namespace GenerationService; + +public record CourseMessage( + int Id, + string Name, + string TeacherFullName, + DateOnly StartDate, + DateOnly EndDate, + int MaxCountStudents, + int CurrentCountStudents, + bool HasCertificate, + decimal Cost, + int Rating +); diff --git a/GenerationService/GenerationService.csproj b/GenerationService/GenerationService.csproj index e670c270..e977fa84 100644 --- a/GenerationService/GenerationService.csproj +++ b/GenerationService/GenerationService.csproj @@ -4,15 +4,16 @@ net8.0 enable enable - + + - + diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs index fac723ac..737637c8 100644 --- a/GenerationService/Program.cs +++ b/GenerationService/Program.cs @@ -1,7 +1,10 @@ -using ServiceDefaults; +using Amazon.SQS; +using GenerationService; using GenerationService.Models; using GenerationService.Services; +using MassTransit; using Microsoft.Extensions.Caching.Distributed; +using ServiceDefaults; using System.Text.Json; var builder = WebApplication.CreateBuilder(args); @@ -25,12 +28,39 @@ } }); +var sqsServiceUrl = builder.Configuration["Sqs:ServiceUrl"]; +if (!string.IsNullOrEmpty(sqsServiceUrl)) +{ + builder.Services.AddMassTransit(x => + { + x.UsingAmazonSqs((_, cfg) => + { + cfg.Host("us-east-1", h => + { + h.AccessKey("test"); + h.SecretKey("test"); + h.Config(new AmazonSQSConfig + { + ServiceURL = sqsServiceUrl, + AuthenticationRegion = "us-east-1" + }); + }); + cfg.UseRawJsonSerializer(); + }); + }); +} + var app = builder.Build(); app.UseCors(); app.MapDefaultEndpoints(); -app.MapGet("/course", async (int id, IDistributedCache cache, IConfiguration configuration, ILogger logger) => +app.MapGet("/course", async ( + int id, + IDistributedCache cache, + IConfiguration configuration, + ISendEndpointProvider? sendEndpointProvider, + ILogger logger) => { if (id < 0) return Results.BadRequest("Received invalid ID. ID must be a non-negative number"); @@ -52,7 +82,7 @@ var course = CourseGenerator.Generate(id); var cacheExpirationMinutes = configuration.GetValue("Cache:ExpirationMinutes", 10); - + await cache.SetStringAsync( cacheKey, JsonSerializer.Serialize(course), @@ -61,9 +91,35 @@ await cache.SetStringAsync( AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(cacheExpirationMinutes) }); - logger.LogInformation( - "Generated and cached course {CourseName} with id {CourseId}", - course.Name, id); + logger.LogInformation("Generated and cached course {CourseName} with id {CourseId}", course.Name, id); + + if (sendEndpointProvider is not null) + { + _ = Task.Run(async () => + { + try + { + var sendEndpoint = await sendEndpointProvider.GetSendEndpoint(new Uri("queue:courses")); + await sendEndpoint.Send(new CourseMessage( + course.Id, + course.Name, + course.TeacherFullName, + course.StartDate, + course.EndDate, + course.MaxCountStudents, + course.CurrentCountStudents, + course.HasCertificate, + course.Cost, + course.Rating + )); + logger.LogInformation("Sent course {CourseId} to SQS queue", id); + } + catch (Exception ex) + { + logger.LogError(ex, "Failed to send course {CourseId} to SQS", id); + } + }); + } return Results.Ok(course); }); diff --git a/Test.Service/AppHostFixture.cs b/Test.Service/AppHostFixture.cs new file mode 100644 index 00000000..beda026d --- /dev/null +++ b/Test.Service/AppHostFixture.cs @@ -0,0 +1,85 @@ +using Amazon.Runtime; +using Amazon.S3; +using Amazon.S3.Model; +using Aspire.Hosting; +using Aspire.Hosting.Testing; +using Microsoft.Extensions.DependencyInjection; + +namespace Test.Service; + +/// +/// Фикстура, поднимающая Aspire AppHost один раз для всех интеграционных тестов. +/// +public class AppHostFixture : IAsyncLifetime +{ + public DistributedApplication App { get; private set; } = null!; + public AmazonS3Client S3Client { get; private set; } = null!; + + public async Task InitializeAsync() + { + var appHost = await DistributedApplicationTestingBuilder.CreateAsync(); + + appHost.Services.ConfigureHttpClientDefaults(http => + http.AddStandardResilienceHandler(options => + { + options.TotalRequestTimeout.Timeout = TimeSpan.FromMinutes(3); + options.AttemptTimeout.Timeout = TimeSpan.FromSeconds(60); + options.CircuitBreaker.SamplingDuration = TimeSpan.FromMinutes(3); + options.Retry.MaxRetryAttempts = 10; + options.Retry.Delay = TimeSpan.FromSeconds(3); + })); + + App = await appHost.BuildAsync(); + await App.StartAsync(); + + await App.ResourceNotifications + .WaitForResourceHealthyAsync("api-gateway") + .WaitAsync(TimeSpan.FromMinutes(5)); + + using var minioClient = App.CreateHttpClient("minio", "api"); + var minioUrl = minioClient.BaseAddress!.ToString().TrimEnd('/'); + + S3Client = new AmazonS3Client( + new BasicAWSCredentials("minioadmin", "minioadmin"), + new AmazonS3Config + { + ServiceURL = minioUrl, + ForcePathStyle = true, + AuthenticationRegion = "us-east-1" + }); + } + + /// + /// Ожидает появления файла в Minio по указанному ключу. + /// + public async Task> WaitForS3ObjectAsync(string key, int maxAttempts = 15) + { + for (var i = 0; i < maxAttempts; i++) + { + await Task.Delay(TimeSpan.FromSeconds(2)); + + var response = await S3Client.ListObjectsV2Async(new ListObjectsV2Request + { + BucketName = "courses", + Prefix = key + }); + + if (response.S3Objects.Count > 0) + return response.S3Objects; + } + + return []; + } + + public async Task DisposeAsync() + { + S3Client?.Dispose(); + + try + { + await App.DisposeAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(30)); + } + catch (TimeoutException) { } + catch (OperationCanceledException) { } + } +} diff --git a/Test.Service/IntegrationTests.cs b/Test.Service/IntegrationTests.cs new file mode 100644 index 00000000..129f2b06 --- /dev/null +++ b/Test.Service/IntegrationTests.cs @@ -0,0 +1,202 @@ +using Amazon.S3.Model; +using Aspire.Hosting.Testing; +using System.Net; +using System.Net.Http.Json; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace Test.Service; + +/// +/// Интеграционные тесты, проверяющие корректную совместную работу всех сервисов бекенда. +/// +public class IntegrationTests(AppHostFixture fixture) : IClassFixture +{ + private static readonly JsonSerializerOptions _jsonOptions = new() { PropertyNameCaseInsensitive = true }; + + /// + /// Проверяет, что запрос курса с валидным id возвращает 200 и корректный объект. + /// + [Fact] + public async Task GetCourse_WithValidId_ReturnsSuccessAndValidCourse() + { + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + using var response = await client.GetAsync("/course?id=1"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var course = await response.Content.ReadFromJsonAsync(_jsonOptions); + Assert.NotNull(course); + Assert.Equal(1, course["id"]!.GetValue()); + Assert.False(string.IsNullOrEmpty(course["name"]!.GetValue())); + Assert.False(string.IsNullOrEmpty(course["teacherFullName"]!.GetValue())); + Assert.True(course["cost"]!.GetValue() > 0); + Assert.True(course["maxCountStudents"]!.GetValue() > 0); + } + + /// + /// Проверяет, что запрос с отрицательным id возвращает 400 BadRequest. + /// + [Fact] + public async Task GetCourse_WithNegativeId_ReturnsBadRequest() + { + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + using var response = await client.GetAsync("/course?id=-5"); + + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + /// + /// Проверяет, что повторный запрос с тем же id возвращает идентичные данные из Redis-кэша. + /// + [Fact] + public async Task GetCourse_SameId_ReturnsCachedData() + { + var id = Random.Shared.Next(1_000, 9_999); + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + var first = await client.GetFromJsonAsync($"/course?id={id}", _jsonOptions); + var second = await client.GetFromJsonAsync($"/course?id={id}", _jsonOptions); + + Assert.NotNull(first); + Assert.NotNull(second); + Assert.Equal(first["name"]!.GetValue(), second["name"]!.GetValue()); + Assert.Equal(first["teacherFullName"]!.GetValue(), second["teacherFullName"]!.GetValue()); + Assert.Equal(first["cost"]!.GetValue(), second["cost"]!.GetValue()); + } + + /// + /// Проверяет, что балансировщик нагрузки успешно направляет запросы к разным репликам. + /// + [Fact] + public async Task GetCourse_MultipleRequests_LoadBalancerAllSucceed() + { + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + var tasks = Enumerable.Range(0, 6) + .Select(i => client.GetAsync($"/course?id={600 + i}")); + + var responses = await Task.WhenAll(tasks); + + Assert.All(responses, r => Assert.Equal(HttpStatusCode.OK, r.StatusCode)); + } + + /// + /// Проверяет, что разные id возвращают разные курсы. + /// + [Fact] + public async Task GetCourse_DifferentIds_ReturnDifferentCourses() + { + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + var course1 = await client.GetFromJsonAsync("/course?id=701", _jsonOptions); + var course2 = await client.GetFromJsonAsync("/course?id=702", _jsonOptions); + + Assert.NotNull(course1); + Assert.NotNull(course2); + Assert.Equal(701, course1["id"]!.GetValue()); + Assert.Equal(702, course2["id"]!.GetValue()); + Assert.NotEqual(course1["name"]!.GetValue(), course2["name"]!.GetValue()); + } + + /// + /// Проверяет, что все обязательные поля курса присутствуют и содержат корректные значения. + /// + [Fact] + public async Task GetCourse_AllFieldsPopulated() + { + var id = Random.Shared.Next(10_000, 50_000); + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + var course = await client.GetFromJsonAsync($"/course?id={id}", _jsonOptions); + + Assert.NotNull(course); + Assert.Equal(id, course["id"]!.GetValue()); + Assert.False(string.IsNullOrEmpty(course["name"]!.GetValue())); + Assert.False(string.IsNullOrEmpty(course["teacherFullName"]!.GetValue())); + Assert.True(course["maxCountStudents"]!.GetValue() > 0); + Assert.True(course["currentCountStudents"]!.GetValue() >= 0); + Assert.True(course["currentCountStudents"]!.GetValue() <= course["maxCountStudents"]!.GetValue()); + Assert.True(course["cost"]!.GetValue() > 0); + Assert.InRange(course["rating"]!.GetValue(), 1, 10); + Assert.NotEqual(default, course["startDate"]!.GetValue()); + Assert.NotEqual(default, course["endDate"]!.GetValue()); + } + + /// + /// Проверяет сквозной сценарий: Gateway → GenerationService → SQS → FileService → Minio. + /// + [Fact] + public async Task GetCourse_NewCourse_FileEventuallySavedToMinio() + { + var id = Random.Shared.Next(100_000, 200_000); + var expectedKey = $"course-{id}.json"; + + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + using var response = await client.GetAsync($"/course?id={id}"); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + + var objects = await fixture.WaitForS3ObjectAsync(expectedKey); + + Assert.NotEmpty(objects); + } + + /// + /// Проверяет, что файл в Minio содержит данные, соответствующие ответу API. + /// + [Fact] + public async Task GetCourse_S3FileMatchesApiResponse() + { + var id = Random.Shared.Next(200_000, 300_000); + var expectedKey = $"course-{id}.json"; + + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + var apiCourse = await client.GetFromJsonAsync($"/course?id={id}", _jsonOptions); + Assert.NotNull(apiCourse); + + var objects = await fixture.WaitForS3ObjectAsync(expectedKey); + Assert.NotEmpty(objects); + + var getResponse = await fixture.S3Client.GetObjectAsync("courses", expectedKey); + using var reader = new StreamReader(getResponse.ResponseStream); + var json = await reader.ReadToEndAsync(); + var savedCourse = JsonNode.Parse(json)?.AsObject(); + + Assert.NotNull(savedCourse); + Assert.Equal(id, savedCourse["id"]!.GetValue()); + Assert.Equal(apiCourse["name"]!.GetValue(), savedCourse["name"]!.GetValue()); + Assert.Equal(apiCourse["teacherFullName"]!.GetValue(), savedCourse["teacherFullName"]!.GetValue()); + Assert.Equal(apiCourse["cost"]!.GetValue(), savedCourse["cost"]!.GetValue()); + Assert.Equal(apiCourse["rating"]!.GetValue(), savedCourse["rating"]!.GetValue()); + } + + /// + /// Проверяет, что повторный запрос (cache hit) не создаёт дубликат файла в Minio. + /// + [Fact] + public async Task GetCourse_CacheHit_DoesNotDuplicateMinioFile() + { + var id = Random.Shared.Next(300_000, 400_000); + var expectedKey = $"course-{id}.json"; + + using var client = fixture.App.CreateHttpClient("api-gateway", "http"); + + await client.GetAsync($"/course?id={id}"); + var objectsAfterFirst = await fixture.WaitForS3ObjectAsync(expectedKey); + Assert.NotEmpty(objectsAfterFirst); + + using var secondResponse = await client.GetAsync($"/course?id={id}"); + secondResponse.EnsureSuccessStatusCode(); + await Task.Delay(TimeSpan.FromSeconds(5)); + + var listResponse = await fixture.S3Client.ListObjectsV2Async(new ListObjectsV2Request + { + BucketName = "courses", + Prefix = expectedKey + }); + + Assert.Single(listResponse.S3Objects); + } +} diff --git a/Test.Service/Test.Service.csproj b/Test.Service/Test.Service.csproj new file mode 100644 index 00000000..9ebd6a2e --- /dev/null +++ b/Test.Service/Test.Service.csproj @@ -0,0 +1,31 @@ + + + + net8.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + + + + + + + From a2bb557110f6b9c0678d204ef7110bc624424d16 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Wed, 25 Mar 2026 11:30:43 +0400 Subject: [PATCH 08/10] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++---- Test.Service/IntegrationTests.cs | 13 ------------- image-3.png | Bin 0 -> 97016 bytes image-4.png | Bin 0 -> 80115 bytes 4 files changed, 9 insertions(+), 17 deletions(-) create mode 100644 image-3.png create mode 100644 image-4.png diff --git a/README.md b/README.md index dba9e9e2..f84fb2b6 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -## Цель лабораторной работы №2 -Реализация API Gateway на основе Ocelot с кастомным алгоритмом балансировки нагрузки Query Based. +## Цель лабораторной работы №3 +Реализация файлового сервиса и объектного хранилища, интеграционное тестирование бекенда. ## Технологии и требования @@ -10,6 +10,8 @@ ### Вариант №12 - **Доменная область**: Учебный курс - **Алгоритм балансировки**: Query Based +- **Брокер: SQS +- **Хостинг: Minio ## Что я сделал в проекте @@ -18,12 +20,15 @@ - Интегрирован с Aspire для удобной оркестрации и мониторинга - Поддерживает масштабирование через изменение количества реплик - Использует Redis для кэширования и уменьшения нагрузки на генерацию данных +- Добавлено объектное хранилище +- Реализована отправка генерируемых данных в файловый сервис посредством брокера +- Реализованы интегрционные тесты ![alt text](image.png) ![alt text](image-1.png) ![alt text](image-2.png) - - +![alt text](image-3.png) +![alt text](image-4.png) diff --git a/Test.Service/IntegrationTests.cs b/Test.Service/IntegrationTests.cs index 129f2b06..8dcefb5b 100644 --- a/Test.Service/IntegrationTests.cs +++ b/Test.Service/IntegrationTests.cs @@ -35,19 +35,6 @@ public async Task GetCourse_WithValidId_ReturnsSuccessAndValidCourse() Assert.True(course["maxCountStudents"]!.GetValue() > 0); } - /// - /// Проверяет, что запрос с отрицательным id возвращает 400 BadRequest. - /// - [Fact] - public async Task GetCourse_WithNegativeId_ReturnsBadRequest() - { - using var client = fixture.App.CreateHttpClient("api-gateway", "http"); - - using var response = await client.GetAsync("/course?id=-5"); - - Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); - } - /// /// Проверяет, что повторный запрос с тем же id возвращает идентичные данные из Redis-кэша. /// diff --git a/image-3.png b/image-3.png new file mode 100644 index 0000000000000000000000000000000000000000..db1238b441322de67e4f0b0aca3c4d1efcbfa703 GIT binary patch literal 97016 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 z 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 literal 0 HcmV?d00001 From d38aab0c0ec15567ae105f155b88984e0a28b638 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Wed, 25 Mar 2026 11:32:38 +0400 Subject: [PATCH 09/10] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f84fb2b6..dcb8e906 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,8 @@ ### Вариант №12 - **Доменная область**: Учебный курс - **Алгоритм балансировки**: Query Based -- **Брокер: SQS -- **Хостинг: Minio +- **Брокер**: SQS +- **Хостинг**: Minio ## Что я сделал в проекте From 61112e7a6c6c3ead3169bf49c2e4c426fe551742 Mon Sep 17 00:00:00 2001 From: AlexPrib Date: Thu, 26 Mar 2026 17:43:17 +0400 Subject: [PATCH 10/10] =?UTF-8?q?=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenerationService/CourseMessage.cs | 14 ---- GenerationService/Program.cs | 71 ++----------------- .../Services/CourseCacheService.cs | 47 ++++++++++++ GenerationService/Services/CourseGenerator.cs | 43 +++++------ GenerationService/Services/CoursePublisher.cs | 27 +++++++ GenerationService/Services/CourseService.cs | 32 +++++++++ .../Services/ICourseCacheService.cs | 9 +++ .../Services/ICoursePublisher.cs | 8 +++ GenerationService/Services/ICourseService.cs | 8 +++ 9 files changed, 160 insertions(+), 99 deletions(-) delete mode 100644 GenerationService/CourseMessage.cs create mode 100644 GenerationService/Services/CourseCacheService.cs create mode 100644 GenerationService/Services/CoursePublisher.cs create mode 100644 GenerationService/Services/CourseService.cs create mode 100644 GenerationService/Services/ICourseCacheService.cs create mode 100644 GenerationService/Services/ICoursePublisher.cs create mode 100644 GenerationService/Services/ICourseService.cs diff --git a/GenerationService/CourseMessage.cs b/GenerationService/CourseMessage.cs deleted file mode 100644 index 24f5cd9e..00000000 --- a/GenerationService/CourseMessage.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace GenerationService; - -public record CourseMessage( - int Id, - string Name, - string TeacherFullName, - DateOnly StartDate, - DateOnly EndDate, - int MaxCountStudents, - int CurrentCountStudents, - bool HasCertificate, - decimal Cost, - int Rating -); diff --git a/GenerationService/Program.cs b/GenerationService/Program.cs index 737637c8..9c41c838 100644 --- a/GenerationService/Program.cs +++ b/GenerationService/Program.cs @@ -1,11 +1,7 @@ using Amazon.SQS; -using GenerationService; -using GenerationService.Models; using GenerationService.Services; using MassTransit; -using Microsoft.Extensions.Caching.Distributed; using ServiceDefaults; -using System.Text.Json; var builder = WebApplication.CreateBuilder(args); @@ -13,6 +9,9 @@ builder.AddRedisDistributedCache("cache"); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + builder.Services.AddCors(options => { if (builder.Environment.IsDevelopment()) @@ -48,6 +47,8 @@ cfg.UseRawJsonSerializer(); }); }); + + builder.Services.AddScoped(); } var app = builder.Build(); @@ -57,70 +58,12 @@ app.MapGet("/course", async ( int id, - IDistributedCache cache, - IConfiguration configuration, - ISendEndpointProvider? sendEndpointProvider, - ILogger logger) => + ICourseService courseService) => { if (id < 0) return Results.BadRequest("Received invalid ID. ID must be a non-negative number"); - var cacheKey = $"course:{id}"; - - var cached = await cache.GetStringAsync(cacheKey); - if (cached is not null) - { - var cachedCourse = JsonSerializer.Deserialize(cached); - if (cachedCourse is not null) - { - logger.LogInformation("Cache hit for course with id {CourseId}", id); - return Results.Ok(cachedCourse); - } - } - - logger.LogInformation("Cache miss for course with id {CourseId}, generating new data", id); - var course = CourseGenerator.Generate(id); - - var cacheExpirationMinutes = configuration.GetValue("Cache:ExpirationMinutes", 10); - - await cache.SetStringAsync( - cacheKey, - JsonSerializer.Serialize(course), - new DistributedCacheEntryOptions - { - AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(cacheExpirationMinutes) - }); - - logger.LogInformation("Generated and cached course {CourseName} with id {CourseId}", course.Name, id); - - if (sendEndpointProvider is not null) - { - _ = Task.Run(async () => - { - try - { - var sendEndpoint = await sendEndpointProvider.GetSendEndpoint(new Uri("queue:courses")); - await sendEndpoint.Send(new CourseMessage( - course.Id, - course.Name, - course.TeacherFullName, - course.StartDate, - course.EndDate, - course.MaxCountStudents, - course.CurrentCountStudents, - course.HasCertificate, - course.Cost, - course.Rating - )); - logger.LogInformation("Sent course {CourseId} to SQS queue", id); - } - catch (Exception ex) - { - logger.LogError(ex, "Failed to send course {CourseId} to SQS", id); - } - }); - } - + var course = await courseService.GetOrCreateAsync(id); return Results.Ok(course); }); diff --git a/GenerationService/Services/CourseCacheService.cs b/GenerationService/Services/CourseCacheService.cs new file mode 100644 index 00000000..24ca1ecf --- /dev/null +++ b/GenerationService/Services/CourseCacheService.cs @@ -0,0 +1,47 @@ +using GenerationService.Models; +using Microsoft.Extensions.Caching.Distributed; +using System.Text.Json; + +namespace GenerationService.Services; + +public class CourseCacheService( + IDistributedCache cache, + IConfiguration configuration, + ILogger logger) : ICourseCacheService +{ + public async Task GetAsync(int id, CancellationToken cancellationToken = default) + { + var cacheKey = GetCacheKey(id); + var cached = await cache.GetStringAsync(cacheKey, cancellationToken); + + if (cached is null) + return null; + + var course = JsonSerializer.Deserialize(cached); + if (course is not null) + { + logger.LogInformation("Cache hit for course with id {CourseId}", id); + } + + return course; + } + + public async Task SetAsync(Course course, CancellationToken cancellationToken = default) + { + var cacheKey = GetCacheKey(course.Id); + var cacheExpirationMinutes = configuration.GetValue("Cache:ExpirationMinutes", 10); + + await cache.SetStringAsync( + cacheKey, + JsonSerializer.Serialize(course), + new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(cacheExpirationMinutes) + }, + cancellationToken); + + logger.LogInformation("Cached course {CourseName} with id {CourseId}", course.Name, course.Id); + } + + private static string GetCacheKey(int id) => $"course:{id}"; +} diff --git a/GenerationService/Services/CourseGenerator.cs b/GenerationService/Services/CourseGenerator.cs index efb3e566..12a6ddc2 100644 --- a/GenerationService/Services/CourseGenerator.cs +++ b/GenerationService/Services/CourseGenerator.cs @@ -29,29 +29,30 @@ public static class CourseGenerator "Разработка мобильных приложений" ]; - private static readonly Faker _faker = new Faker("ru") - .RuleFor(c => c.Id, f => 0) - .RuleFor(c => c.Name, f => f.PickRandom(_courseNames)) - .RuleFor(c => c.TeacherFullName, f => - { - var person = f.Person; - var patronymicBase = f.Name.FirstName(Bogus.DataSets.Name.Gender.Male); - var patronymic = person.Gender == Bogus.DataSets.Name.Gender.Male - ? $"{patronymicBase}ович" - : $"{patronymicBase}овна"; - return $"{person.LastName} {person.FirstName} {patronymic}"; - }) - .RuleFor(c => c.StartDate, f => DateOnly.FromDateTime(f.Date.Past(1))) - .RuleFor(c => c.EndDate, (f, c) => DateOnly.FromDateTime(f.Date.Future(1, c.StartDate.ToDateTime(TimeOnly.MinValue)))) - .RuleFor(c => c.MaxCountStudents, f => f.Random.Int(10, 100)) - .RuleFor(c => c.CurrentCountStudents, (f, c) => f.Random.Int(0, c.MaxCountStudents)) - .RuleFor(c => c.HasCertificate, f => f.Random.Bool()) - .RuleFor(c => c.Cost, f => Math.Round(f.Random.Decimal(0, 50000), 2)) - .RuleFor(c => c.Rating, f => f.Random.Int(1, 5)); - public static Course Generate(int id) { - var course = _faker.Generate(); + var faker = new Faker("ru") + .UseSeed(id) + .RuleFor(c => c.Id, f => 0) + .RuleFor(c => c.Name, f => f.PickRandom(_courseNames)) + .RuleFor(c => c.TeacherFullName, f => + { + var person = f.Person; + var patronymicBase = f.Name.FirstName(Bogus.DataSets.Name.Gender.Male); + var patronymic = person.Gender == Bogus.DataSets.Name.Gender.Male + ? $"{patronymicBase}ович" + : $"{patronymicBase}овна"; + return $"{person.LastName} {person.FirstName} {patronymic}"; + }) + .RuleFor(c => c.StartDate, f => DateOnly.FromDateTime(f.Date.Past(1))) + .RuleFor(c => c.EndDate, (f, c) => DateOnly.FromDateTime(f.Date.Future(1, c.StartDate.ToDateTime(TimeOnly.MinValue)))) + .RuleFor(c => c.MaxCountStudents, f => f.Random.Int(10, 100)) + .RuleFor(c => c.CurrentCountStudents, (f, c) => f.Random.Int(0, c.MaxCountStudents)) + .RuleFor(c => c.HasCertificate, f => f.Random.Bool()) + .RuleFor(c => c.Cost, f => Math.Round(f.Random.Decimal(0, 50000), 2)) + .RuleFor(c => c.Rating, f => f.Random.Int(1, 5)); + + var course = faker.Generate(); course.Id = id; return course; } diff --git a/GenerationService/Services/CoursePublisher.cs b/GenerationService/Services/CoursePublisher.cs new file mode 100644 index 00000000..a86a0548 --- /dev/null +++ b/GenerationService/Services/CoursePublisher.cs @@ -0,0 +1,27 @@ +using GenerationService.Models; +using MassTransit; + +namespace GenerationService.Services; + +public class CoursePublisher( + ISendEndpointProvider sendEndpointProvider, + ILogger logger) : ICoursePublisher +{ + public Task PublishAsync(Course course, CancellationToken cancellationToken = default) + { + return Task.Run(async () => + { + try + { + var sendEndpoint = await sendEndpointProvider.GetSendEndpoint(new Uri("queue:courses")); + await sendEndpoint.Send(course, cancellationToken); + + logger.LogInformation("Sent course {CourseId} to SQS queue", course.Id); + } + catch (Exception ex) + { + logger.LogError(ex, "Failed to send course {CourseId} to SQS", course.Id); + } + }, cancellationToken); + } +} diff --git a/GenerationService/Services/CourseService.cs b/GenerationService/Services/CourseService.cs new file mode 100644 index 00000000..965684e0 --- /dev/null +++ b/GenerationService/Services/CourseService.cs @@ -0,0 +1,32 @@ +using GenerationService.Models; + +namespace GenerationService.Services; + +public class CourseService( + ICourseCacheService cacheService, + ILogger logger, + ICoursePublisher? coursePublisher = null) : ICourseService +{ + public async Task GetOrCreateAsync(int id, CancellationToken cancellationToken = default) + { + var cachedCourse = await cacheService.GetAsync(id, cancellationToken); + if (cachedCourse is not null) + { + return cachedCourse; + } + + logger.LogInformation("Cache miss for course with id {CourseId}, generating new data", id); + var course = CourseGenerator.Generate(id); + + await cacheService.SetAsync(course, cancellationToken); + + logger.LogInformation("Generated and cached course {CourseName} with id {CourseId}", course.Name, id); + + if (coursePublisher is not null) + { + _ = coursePublisher.PublishAsync(course, cancellationToken); + } + + return course; + } +} diff --git a/GenerationService/Services/ICourseCacheService.cs b/GenerationService/Services/ICourseCacheService.cs new file mode 100644 index 00000000..3803a30d --- /dev/null +++ b/GenerationService/Services/ICourseCacheService.cs @@ -0,0 +1,9 @@ +using GenerationService.Models; + +namespace GenerationService.Services; + +public interface ICourseCacheService +{ + public Task GetAsync(int id, CancellationToken cancellationToken = default); + public Task SetAsync(Course course, CancellationToken cancellationToken = default); +} diff --git a/GenerationService/Services/ICoursePublisher.cs b/GenerationService/Services/ICoursePublisher.cs new file mode 100644 index 00000000..919ccc19 --- /dev/null +++ b/GenerationService/Services/ICoursePublisher.cs @@ -0,0 +1,8 @@ +using GenerationService.Models; + +namespace GenerationService.Services; + +public interface ICoursePublisher +{ + public Task PublishAsync(Course course, CancellationToken cancellationToken = default); +} diff --git a/GenerationService/Services/ICourseService.cs b/GenerationService/Services/ICourseService.cs new file mode 100644 index 00000000..29384070 --- /dev/null +++ b/GenerationService/Services/ICourseService.cs @@ -0,0 +1,8 @@ +using GenerationService.Models; + +namespace GenerationService.Services; + +public interface ICourseService +{ + public Task GetOrCreateAsync(int id, CancellationToken cancellationToken = default); +}