From 78fe9cf89d03d93990c7d0d0b1627b98b4bb5497 Mon Sep 17 00:00:00 2001 From: Matvey6M6 Date: Tue, 14 Apr 2026 20:14:26 +0400 Subject: [PATCH 1/3] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Генерация сотрудников +Кеширование Redis +Aspire оркестрация --- AspireApp/AspireApp.AppHost/AppHost.cs | 13 +++ .../AspireApp.AppHost.csproj | 23 ++++ .../Properties/launchSettings.json | 32 ++++++ .../appsettings.Development.json | 8 ++ AspireApp/AspireApp.AppHost/appsettings.json | 8 ++ .../AspireApp.ServiceDefaults.csproj | 21 ++++ .../AspireApp.ServiceDefaults/Extensions.cs | 101 ++++++++++++++++++ Client.Wasm/Components/DataCard.razor | 44 ++++++-- Client.Wasm/Components/StudentCard.razor | 14 ++- Client.Wasm/wwwroot/appsettings.json | 2 +- Client.Wasm/wwwroot/index.html | 6 +- ServiceApi/Entities/Employee.cs | 39 +++++++ ServiceApi/Generator/EmployeeGenerator.cs | 92 ++++++++++++++++ .../Generator/EmployeeGeneratorService.cs | 82 ++++++++++++++ .../Generator/IEmployeeGeneratorService.cs | 11 ++ ServiceApi/Program.cs | 60 +++++++++++ ServiceApi/Properties/launchSettings.json | 14 +++ ServiceApi/Service.Api.csproj | 20 ++++ ServiceApi/appsettings.Development.json | 12 +++ ServiceApi/appsettings.json | 10 ++ var.md | 33 ++++++ 21 files changed, 627 insertions(+), 18 deletions(-) create mode 100644 AspireApp/AspireApp.AppHost/AppHost.cs create mode 100644 AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj create mode 100644 AspireApp/AspireApp.AppHost/Properties/launchSettings.json create mode 100644 AspireApp/AspireApp.AppHost/appsettings.Development.json create mode 100644 AspireApp/AspireApp.AppHost/appsettings.json create mode 100644 AspireApp/AspireApp.ServiceDefaults/AspireApp.ServiceDefaults.csproj create mode 100644 AspireApp/AspireApp.ServiceDefaults/Extensions.cs create mode 100644 ServiceApi/Entities/Employee.cs create mode 100644 ServiceApi/Generator/EmployeeGenerator.cs create mode 100644 ServiceApi/Generator/EmployeeGeneratorService.cs create mode 100644 ServiceApi/Generator/IEmployeeGeneratorService.cs create mode 100644 ServiceApi/Program.cs create mode 100644 ServiceApi/Properties/launchSettings.json create mode 100644 ServiceApi/Service.Api.csproj create mode 100644 ServiceApi/appsettings.Development.json create mode 100644 ServiceApi/appsettings.json create mode 100644 var.md diff --git a/AspireApp/AspireApp.AppHost/AppHost.cs b/AspireApp/AspireApp.AppHost/AppHost.cs new file mode 100644 index 00000000..54b3941e --- /dev/null +++ b/AspireApp/AspireApp.AppHost/AppHost.cs @@ -0,0 +1,13 @@ +var builder = DistributedApplication.CreateBuilder(args); + +var cache = builder.AddRedis("employee-cache") + .WithRedisInsight(containerName: "employee-insight"); + +var service = builder.AddProject("service-api") + .WithReference(cache, "RedisCache") + .WaitFor(cache); + +builder.AddProject("employee-wasm") + .WaitFor(service); + +builder.Build().Run(); diff --git a/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj b/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj new file mode 100644 index 00000000..c993eb76 --- /dev/null +++ b/AspireApp/AspireApp.AppHost/AspireApp.AppHost.csproj @@ -0,0 +1,23 @@ + + + + + + Exe + net8.0 + enable + enable + true + + + + + + + + + + + + + diff --git a/AspireApp/AspireApp.AppHost/Properties/launchSettings.json b/AspireApp/AspireApp.AppHost/Properties/launchSettings.json new file mode 100644 index 00000000..df45cce3 --- /dev/null +++ b/AspireApp/AspireApp.AppHost/Properties/launchSettings.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:17096;http://localhost:15155", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "https://localhost:21139", + "DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "https://localhost:21140", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "https://localhost:22017" + } + }, + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:15155", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development", + "DOTNET_ENVIRONMENT": "Development", + "ASPIRE_ALLOW_UNSECURED_TRANSPORT": "true", + "DOTNET_DASHBOARD_OTLP_ENDPOINT_URL": "http://localhost:19197", + "DOTNET_DASHBOARD_OTLP_HTTP_ENDPOINT_URL": "http://localhost:19198", + "DOTNET_RESOURCE_SERVICE_ENDPOINT_URL": "http://localhost:20116" + } + } + } +} diff --git a/AspireApp/AspireApp.AppHost/appsettings.Development.json b/AspireApp/AspireApp.AppHost/appsettings.Development.json new file mode 100644 index 00000000..167eb683 --- /dev/null +++ b/AspireApp/AspireApp.AppHost/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Aspire.Hosting": "Information" + } + } +} diff --git a/AspireApp/AspireApp.AppHost/appsettings.json b/AspireApp/AspireApp.AppHost/appsettings.json new file mode 100644 index 00000000..167eb683 --- /dev/null +++ b/AspireApp/AspireApp.AppHost/appsettings.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Aspire.Hosting": "Information" + } + } +} diff --git a/AspireApp/AspireApp.ServiceDefaults/AspireApp.ServiceDefaults.csproj b/AspireApp/AspireApp.ServiceDefaults/AspireApp.ServiceDefaults.csproj new file mode 100644 index 00000000..530518fa --- /dev/null +++ b/AspireApp/AspireApp.ServiceDefaults/AspireApp.ServiceDefaults.csproj @@ -0,0 +1,21 @@ + + + + net8.0 + enable + enable + true + + + + + + + + + + + + + + diff --git a/AspireApp/AspireApp.ServiceDefaults/Extensions.cs b/AspireApp/AspireApp.ServiceDefaults/Extensions.cs new file mode 100644 index 00000000..e8399ba7 --- /dev/null +++ b/AspireApp/AspireApp.ServiceDefaults/Extensions.cs @@ -0,0 +1,101 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.ServiceDiscovery; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.Hosting; + +public static class Extensions +{ + public static TBuilder AddServiceDefaults(this TBuilder builder) + where TBuilder : IHostApplicationBuilder + { + builder.ConfigureOpenTelemetry(); + builder.AddDefaultHealthChecks(); + + builder.Services.AddServiceDiscovery(); + + builder.Services.ConfigureHttpClientDefaults(http => + { + http.AddStandardResilienceHandler(); + http.AddServiceDiscovery(); + }); + + return builder; + } + + public static TBuilder ConfigureOpenTelemetry(this TBuilder builder) + where TBuilder : IHostApplicationBuilder + { + builder.Logging.AddOpenTelemetry(logging => + { + logging.IncludeFormattedMessage = true; + logging.IncludeScopes = true; + }); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => + { + metrics.AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddRuntimeInstrumentation(); + }) + .WithTracing(tracing => + { + tracing.AddSource(builder.Environment.ApplicationName) + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation(); + }); + + builder.AddOpenTelemetryExporters(); + + return builder; + } + + private static TBuilder AddOpenTelemetryExporters(this TBuilder builder) + where TBuilder : IHostApplicationBuilder + { + var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]); + + if (!useOtlpExporter) + { + return builder; + } + + builder.Logging.AddOpenTelemetry(logging => logging.AddOtlpExporter()); + + builder.Services.AddOpenTelemetry() + .WithMetrics(metrics => metrics.AddOtlpExporter()) + .WithTracing(tracing => tracing.AddOtlpExporter()); + + return builder; + } + + public static TBuilder AddDefaultHealthChecks(this TBuilder builder) + where TBuilder : IHostApplicationBuilder + { + builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), tags: ["live"]); + + return builder; + } + + public static WebApplication MapDefaultEndpoints(this WebApplication app) + { + if (app.Environment.IsDevelopment()) + { + app.MapHealthChecks("/health"); + app.MapHealthChecks("/alive", new HealthCheckOptions + { + Predicate = registration => registration.Tags.Contains("live") + }); + } + + return app; + } +} diff --git a/Client.Wasm/Components/DataCard.razor b/Client.Wasm/Components/DataCard.razor index c646a839..f2b945ac 100644 --- a/Client.Wasm/Components/DataCard.razor +++ b/Client.Wasm/Components/DataCard.razor @@ -1,4 +1,4 @@ -@inject IConfiguration Configuration +@inject IConfiguration Configuration @inject HttpClient Client @@ -7,7 +7,12 @@ Характеристики текущего объекта - + @if (!string.IsNullOrWhiteSpace(ErrorMessage)) + { + @ErrorMessage + } + +
# @@ -30,7 +35,7 @@ foreach (var property in array) { - @(Array.IndexOf(array, property)+1) + @(Array.IndexOf(array, property) + 1) @property.Key @property.Value?.ToString() @@ -51,10 +56,10 @@ Идентификатор нового объекта: - + - + @@ -63,12 +68,33 @@ @code { private JsonObject? Value { get; set; } - private int Id { get; set; } + private string? ErrorMessage { get; set; } + private int Id { get; set; } = 1; private async Task RequestNewData() { - var baseAddress = Configuration["BaseAddress"] ?? throw new KeyNotFoundException("Конфигурация клиента не содержит параметра BaseAddress"); - Value = await Client.GetFromJsonAsync($"{baseAddress}?id={Id}", new JsonSerializerOptions { }); - StateHasChanged(); + ErrorMessage = null; + + if (Id <= 0) + { + ErrorMessage = "Идентификатор должен быть больше нуля."; + return; + } + + var baseAddress = Configuration["BaseAddress"]; + if (string.IsNullOrWhiteSpace(baseAddress)) + { + baseAddress = "http://localhost:7099/employee"; + } + + try + { + Value = await Client.GetFromJsonAsync($"{baseAddress.TrimEnd('/')}?id={Id}", new JsonSerializerOptions()); + } + catch (Exception exception) + { + Value = null; + ErrorMessage = $"Не удалось получить данные сотрудника: {exception.Message}"; + } } } diff --git a/Client.Wasm/Components/StudentCard.razor b/Client.Wasm/Components/StudentCard.razor index 661f1181..f12c48a0 100644 --- a/Client.Wasm/Components/StudentCard.razor +++ b/Client.Wasm/Components/StudentCard.razor @@ -1,13 +1,17 @@  - Лабораторная работа + + Лабораторная работа + - Номер №X "Название лабораторной" - Вариант №Х "Название варианта" - Выполнена Фамилией Именем 65ХХ - Ссылка на форк + Номер №1 "Кэширование" + Вариант №28 "Сотрудник компании" + Выполнена Миронюк Матвеем 6512 + + Ссылка на форк + diff --git a/Client.Wasm/wwwroot/appsettings.json b/Client.Wasm/wwwroot/appsettings.json index d1fe7ab3..39898806 100644 --- a/Client.Wasm/wwwroot/appsettings.json +++ b/Client.Wasm/wwwroot/appsettings.json @@ -6,5 +6,5 @@ } }, "AllowedHosts": "*", - "BaseAddress": "" + "BaseAddress": "http://localhost:7099/employee" } diff --git a/Client.Wasm/wwwroot/index.html b/Client.Wasm/wwwroot/index.html index b74ee328..e9863ba2 100644 --- a/Client.Wasm/wwwroot/index.html +++ b/Client.Wasm/wwwroot/index.html @@ -9,10 +9,10 @@ - - + + - + diff --git a/ServiceApi/Entities/Employee.cs b/ServiceApi/Entities/Employee.cs new file mode 100644 index 00000000..fec349fb --- /dev/null +++ b/ServiceApi/Entities/Employee.cs @@ -0,0 +1,39 @@ +using System.Text.Json.Serialization; + +namespace Service.Api.Entities; + +/// +/// Сотрудник компании. +/// +public sealed class Employee +{ + [JsonPropertyName("id")] + public int Id { get; set; } + + [JsonPropertyName("fullName")] + public string FullName { get; set; } = string.Empty; + + [JsonPropertyName("position")] + public string Position { get; set; } = string.Empty; + + [JsonPropertyName("department")] + public string Department { get; set; } = string.Empty; + + [JsonPropertyName("hireDate")] + public DateOnly HireDate { get; set; } + + [JsonPropertyName("salary")] + public decimal Salary { get; set; } + + [JsonPropertyName("email")] + public string Email { get; set; } = string.Empty; + + [JsonPropertyName("phone")] + public string Phone { get; set; } = string.Empty; + + [JsonPropertyName("isFired")] + public bool IsFired { get; set; } + + [JsonPropertyName("fireDate")] + public DateOnly? FireDate { get; set; } +} diff --git a/ServiceApi/Generator/EmployeeGenerator.cs b/ServiceApi/Generator/EmployeeGenerator.cs new file mode 100644 index 00000000..b3e7645e --- /dev/null +++ b/ServiceApi/Generator/EmployeeGenerator.cs @@ -0,0 +1,92 @@ +using Bogus; +using Bogus.DataSets; +using Service.Api.Entities; + +namespace Service.Api.Generator; + +/// +/// Генератор случайных сотрудников компании. +/// +public static class EmployeeGenerator +{ + private static readonly string[] ProfessionCatalog = + { + "Developer", + "Manager", + "Analyst", + "Tester", + "Administrator", + "Designer" + }; + + private static readonly string[] PositionLevels = + { + "Junior", + "Middle", + "Senior" + }; + + public static Employee Generate(int id) + { + var faker = new Faker("ru"); + + var gender = faker.PickRandom(); + var firstName = faker.Name.FirstName(gender); + var lastName = faker.Name.LastName(gender); + var patronymic = BuildPatronymic(faker.Name.FirstName(Name.Gender.Male), gender); + + var level = faker.PickRandom(PositionLevels); + var profession = faker.PickRandom(ProfessionCatalog); + var hireDate = faker.Date.Past(10, DateTime.Today); + var isFired = faker.Random.Bool(0.18f); + + DateOnly? fireDate = null; + if (isFired) + { + fireDate = DateOnly.FromDateTime(faker.Date.Between(hireDate, DateTime.Today)); + } + + return new Employee + { + Id = id, + FullName = $"{lastName} {firstName} {patronymic}", + Position = $"{level} {profession}", + Department = faker.Commerce.Department(), + HireDate = DateOnly.FromDateTime(hireDate), + Salary = CalculateSalary(level, faker), + Email = faker.Internet.Email(firstName, lastName), + Phone = faker.Phone.PhoneNumber("+7(###)###-##-##"), + IsFired = isFired, + FireDate = fireDate + }; + } + + private static string BuildPatronymic(string sourceName, Name.Gender gender) + { + if (string.IsNullOrWhiteSpace(sourceName)) + { + return gender == Name.Gender.Male ? "Иванович" : "Ивановна"; + } + + return gender switch + { + Name.Gender.Male when sourceName.EndsWith('й') => $"{sourceName[..^1]}евич", + Name.Gender.Female when sourceName.EndsWith('й') => $"{sourceName[..^1]}евна", + Name.Gender.Male => $"{sourceName}ович", + _ => $"{sourceName}овна" + }; + } + + private static decimal CalculateSalary(string level, Faker faker) + { + var value = level switch + { + "Junior" => faker.Random.Decimal(60_000m, 95_000m), + "Middle" => faker.Random.Decimal(100_000m, 170_000m), + "Senior" => faker.Random.Decimal(180_000m, 280_000m), + _ => faker.Random.Decimal(80_000m, 120_000m) + }; + + return Math.Round(value, 2, MidpointRounding.AwayFromZero); + } +} diff --git a/ServiceApi/Generator/EmployeeGeneratorService.cs b/ServiceApi/Generator/EmployeeGeneratorService.cs new file mode 100644 index 00000000..64f4a716 --- /dev/null +++ b/ServiceApi/Generator/EmployeeGeneratorService.cs @@ -0,0 +1,82 @@ +using System.Text.Json; +using Microsoft.Extensions.Caching.Distributed; +using Service.Api.Entities; + +namespace Service.Api.Generator; + +public sealed class EmployeeGeneratorService( + IDistributedCache cache, + ILogger logger, + IConfiguration configuration) : IEmployeeGeneratorService +{ + private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web); + + private readonly TimeSpan _cacheExpiration = + TimeSpan.FromMinutes(configuration.GetValue("CacheExpirationMinutes") ?? 30); + + public async Task ProcessEmployee(int id, CancellationToken cancellationToken = default) + { + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(id); + + var cacheKey = id.ToString(); + + using var _ = logger.BeginScope(new Dictionary + { + ["EmployeeId"] = id, + ["CacheKey"] = cacheKey + }); + + logger.LogInformation("Employee request received"); + + try + { + var employee = await RetrieveFromCache(cacheKey, cancellationToken); + if (employee is not null) + { + logger.LogInformation("Cache hit. Returning employee from Redis"); + return employee; + } + + logger.LogInformation("Cache miss. Generating new employee"); + employee = EmployeeGenerator.Generate(id); + await PopulateCache(cacheKey, employee, cancellationToken); + + logger.LogInformation( + "Employee {EmployeeId} stored in cache for {CacheLifetimeMinutes} minutes", + id, + _cacheExpiration.TotalMinutes); + + return employee; + } + catch (Exception exception) + { + logger.LogError(exception, "Error while processing employee {EmployeeId}", id); + throw; + } + } + + private async Task RetrieveFromCache(string cacheKey, CancellationToken cancellationToken) + { + var json = await cache.GetStringAsync(cacheKey, cancellationToken); + if (string.IsNullOrWhiteSpace(json)) + { + return null; + } + + return JsonSerializer.Deserialize(json, JsonOptions); + } + + private async Task PopulateCache(string cacheKey, Employee employee, CancellationToken cancellationToken) + { + var json = JsonSerializer.Serialize(employee, JsonOptions); + + await cache.SetStringAsync( + cacheKey, + json, + new DistributedCacheEntryOptions + { + AbsoluteExpirationRelativeToNow = _cacheExpiration + }, + cancellationToken); + } +} diff --git a/ServiceApi/Generator/IEmployeeGeneratorService.cs b/ServiceApi/Generator/IEmployeeGeneratorService.cs new file mode 100644 index 00000000..c8de0288 --- /dev/null +++ b/ServiceApi/Generator/IEmployeeGeneratorService.cs @@ -0,0 +1,11 @@ +using Service.Api.Entities; + +namespace Service.Api.Generator; + +/// +/// Интерфейс обработки запросов на получение сотрудника. +/// +public interface IEmployeeGeneratorService +{ + Task ProcessEmployee(int id, CancellationToken cancellationToken = default); +} diff --git a/ServiceApi/Program.cs b/ServiceApi/Program.cs new file mode 100644 index 00000000..d4ddf2d9 --- /dev/null +++ b/ServiceApi/Program.cs @@ -0,0 +1,60 @@ +using Service.Api.Generator; + +var builder = WebApplication.CreateBuilder(args); + +builder.AddServiceDefaults(); +builder.AddRedisDistributedCache("RedisCache"); + +builder.Logging.ClearProviders(); +builder.Logging.AddJsonConsole(options => +{ + options.IncludeScopes = true; + options.TimestampFormat = "yyyy-MM-ddTHH:mm:ss.fffZ "; +}); + +builder.Services.AddScoped(); + +builder.Services.AddCors(options => options.AddDefaultPolicy(policy => +{ + policy.SetIsOriginAllowed(origin => + Uri.TryCreate(origin, UriKind.Absolute, out var uri) + && uri.IsLoopback + && (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps)) + .AllowAnyHeader() + .WithMethods("GET"); +})); + +var app = builder.Build(); + +app.MapDefaultEndpoints(); + +app.MapGet("/", () => Results.Ok(new +{ + service = "Service.Api", + description = "Сервис генерации сотрудников компании", + endpoints = new[] { "/employee?id=1", "/employee/1" } +})); + +app.MapGet("/employee", async (IEmployeeGeneratorService service, int id, CancellationToken cancellationToken) => +{ + if (id <= 0) + { + return Results.BadRequest(new { message = "Идентификатор сотрудника должен быть больше нуля." }); + } + + return Results.Ok(await service.ProcessEmployee(id, cancellationToken)); +}); + +app.MapGet("/employee/{id:int}", async (IEmployeeGeneratorService service, int id, CancellationToken cancellationToken) => +{ + if (id <= 0) + { + return Results.BadRequest(new { message = "Идентификатор сотрудника должен быть больше нуля." }); + } + + return Results.Ok(await service.ProcessEmployee(id, cancellationToken)); +}); + +app.UseCors(); + +app.Run(); diff --git a/ServiceApi/Properties/launchSettings.json b/ServiceApi/Properties/launchSettings.json new file mode 100644 index 00000000..0641ca27 --- /dev/null +++ b/ServiceApi/Properties/launchSettings.json @@ -0,0 +1,14 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "applicationUrl": "http://localhost:7099", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/ServiceApi/Service.Api.csproj b/ServiceApi/Service.Api.csproj new file mode 100644 index 00000000..e609ccc7 --- /dev/null +++ b/ServiceApi/Service.Api.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + enable + enable + Service.Api + Service.Api + + + + + + + + + + + + diff --git a/ServiceApi/appsettings.Development.json b/ServiceApi/appsettings.Development.json new file mode 100644 index 00000000..6e16757b --- /dev/null +++ b/ServiceApi/appsettings.Development.json @@ -0,0 +1,12 @@ +{ + "CacheExpirationMinutes": 30, + "ConnectionStrings": { + "RedisCache": "localhost:6379" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/ServiceApi/appsettings.json b/ServiceApi/appsettings.json new file mode 100644 index 00000000..5f1aabbb --- /dev/null +++ b/ServiceApi/appsettings.json @@ -0,0 +1,10 @@ +{ + "CacheExpirationMinutes": 30, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/var.md b/var.md new file mode 100644 index 00000000..1fdd282b --- /dev/null +++ b/var.md @@ -0,0 +1,33 @@ +# Вариант №28 +Сотрудник компании +Weighted Round Robin +SNS +Localstack + +# «Сотрудник компании» +Необходимо сгенерировать информацию о сотруднике компании со следующими характеристиками: + ++----+-------------------------------------------+-------------+ +| № | Название | Тип данных | ++----+-------------------------------------------+-------------+ +| 1 | Идентификатор сотрудника в системе | int | +| 2 | ФИО | string | +| 3 | Должность | string | +| 4 | Отдел | string | +| 5 | Дата приема | DateOnly | +| 6 | Оклад | decimal | +| 7 | Электронная почта | string | +| 8 | Номер телефона | string | +| 9 | Индикатор увольнения | bool | +| 10 | Дата увольнения | DateOnly? | ++----+-------------------------------------------+-------------+ + +Комментарии к характеристикам: +ФИО - конкатенация фамилии, имени и отчества через пробел, все из раздела Name +Должность выбирается из двух заранее подготовленных справочников - справочника профессий (“Developer”, “Manager”, “Analyst” и т.д.) и суффиксов к ним (“Junior”, “Middle”, “Senior” и т.д.) +Отдел берется из раздела Commerce +Дата приема берется не более, чем 10 лет назад от текущей даты +Генерация суммы оклада должна коррелировать с суффиксом должности и не иметь более 2 знаков в дробной части +Электронная почта генерируется из раздела Internet +При отсутствии индикатора увольнения дата увольнения не заполняется +Телефонный номер должен браться из раздела Phone и быть формата +7(***)***-**-** From 8ac4d1803c933456028aa3568995c54d1408910b Mon Sep 17 00:00:00 2001 From: Matvey6M6 Date: Tue, 14 Apr 2026 20:30:47 +0400 Subject: [PATCH 2/3] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20Readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +немного скринов +обновленный Readme --- 1.PNG | Bin 0 -> 25654 bytes 2.PNG | Bin 0 -> 40256 bytes 3.PNG | Bin 0 -> 28184 bytes README.md | 128 ++++++++++++++++-------------------------------------- 4 files changed, 38 insertions(+), 90 deletions(-) create mode 100644 1.PNG create mode 100644 2.PNG create mode 100644 3.PNG diff --git a/1.PNG b/1.PNG new file mode 100644 index 0000000000000000000000000000000000000000..7f18802ade5b642e6263fb75372f5d55525c7b73 GIT binary patch literal 25654 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 literal 0 HcmV?d00001 diff --git a/3.PNG b/3.PNG new file mode 100644 index 0000000000000000000000000000000000000000..fdbd046213c9b0940823154ca0e8af6c4905e72a GIT binary patch literal 28184 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
-2. «Балансировка нагрузки» - Реализация апи гейтвея, настройка его работы -
- -В рамках второй лабораторной работы необходимо: -* Настроить оркестрацию на запуск нескольких реплик сервиса генерации, -* Реализовать апи гейтвей на основе Ocelot, -* Имплементировать алгоритм балансировки нагрузки согласно варианту. - -
-
-
-3. «Интеграционное тестирование» - Реализация файлового сервиса и объектного хранилища, интеграционное тестирование бекенда -
- -В рамках третьей лабораторной работы необходимо: -* Добавить в оркестрацию объектное хранилище, -* Реализовать файловый сервис, сериализующий сгенерированные данные в файлы и сохраняющий их в объектном хранилище, -* Реализовать отправку генерируемых данных в файловый сервис посредством брокера, -* Реализовать интеграционные тесты, проверяющие корректность работы всех сервисов бекенда вместе. - -
-
-
-4. (Опционально) «Переход на облачную инфраструктуру» - Перенос бекенда в Yandex Cloud -
- -В рамках четвертой лабораторной работы необходимо перенестиервисы на облако все ранее разработанные сервисы: -* Клиент - в хостинг через отдельный бакет Object Storage, -* Сервис генерации - в Cloud Function, -* Апи гейтвей - в Serverless Integration как API Gateway, -* Брокер сообщений - в Message Queue, -* Файловый сервис - в Cloud Function, -* Объектное хранилище - в отдельный бакет Object Storage, -
+### Вариант №28 +| Доменная область | Балансировка | Брокер | Хостинг S3 | +| --- | --- | --- | --- | +| Сотрудник компании | Weighted Round Robin | SNS | Localstack |
-## Задание. Общая часть -**Обязательно**: -* Реализация серверной части на [.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 + «Сотрудник компании» +Необходимо сгенерировать информацию о сотруднике компании со следующими характеристиками: + ++----+-------------------------------------------+-------------+ +| № | Название | Тип данных | ++----+-------------------------------------------+-------------+ +| 1 | Идентификатор сотрудника в системе | int | +| 2 | ФИО | string | +| 3 | Должность | string | +| 4 | Отдел | string | +| 5 | Дата приема | DateOnly | +| 6 | Оклад | decimal | +| 7 | Электронная почта | string | +| 8 | Номер телефона | string | +| 9 | Индикатор увольнения | bool | +| 10 | Дата увольнения | DateOnly? | ++----+-------------------------------------------+-------------+ + +Комментарии к характеристикам: +ФИО - конкатенация фамилии, имени и отчества через пробел, все из раздела Name +Должность выбирается из двух заранее подготовленных справочников - справочника профессий (“Developer”, “Manager”, “Analyst” и т.д.) и суффиксов к ним (“Junior”, “Middle”, “Senior” и т.д.) +Отдел берется из раздела Commerce +Дата приема берется не более, чем 10 лет назад от текущей даты +Генерация суммы оклада должна коррелировать с суффиксом должности и не иметь более 2 знаков в дробной части +Электронная почта генерируется из раздела Internet +При отсутствии индикатора увольнения дата увольнения не заполняется +Телефонный номер должен браться из раздела Phone и быть формата +7(***)***-**-**
-## Варианты заданий -Номер варианта задания присваивается в начале семестра. Изменить его нельзя. Каждый вариант имеет уникальную комбинацию из предметной области, базы данных и технологии для общения сервиса генерации данных и сервера апи. - -[Список вариантов](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, получают дополнительный балл - -## Вопросы и обратная связь по курсу +##### Aspire +![alt text](1.png) -Чтобы задать вопрос по лабораторной, воспользуйтесь [соответствующим разделом дискуссий](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). +##### Получение данных +![alt text](2.png) +##### Логи +![alt text](3.png) \ No newline at end of file From e895e52dac9047322d6ebf371caade6af34ce9fe Mon Sep 17 00:00:00 2001 From: Matvey6M6 Date: Tue, 14 Apr 2026 20:35:48 +0400 Subject: [PATCH 3/3] fix readme --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 54374946..658ed378 100644 --- a/README.md +++ b/README.md @@ -67,10 +67,10 @@ ##### Aspire -![alt text](1.png) +![alt text](1.PNG) ##### Получение данных -![alt text](2.png) +![alt text](2.PNG) ##### Логи -![alt text](3.png) \ No newline at end of file +![alt text](3.PNG) \ No newline at end of file