# Отчет по лабораторной работе №3 Выполнил студент гр. ИСЭбд-41 Миронов Е.О. ## REST API, Gateway и синхронный обмен между микросервисами ## Создание микросервисов 1. С помощью команды `dotnet new web -n worker-1` в терминале создал первый микросервис 2. Добавил решение командой `dotnet new sln` 3. Связал решение и проект командой `dotnet sln worker-1.sln add worker-1.csproj` 4. Повторил действие для второго микросервиса 5. Добавил библиотеку Swagger и OpenAi в проекты и запустил с помощью команды `dotnet run` 6. Заложил в приложения следующую логику : worker-1 - CRUD для сущности Company worker-2 - CRUD для сущности Employee К одной Company относится много Employee Скриншоты API обоих приложений:   ## Реализация синхронного обмена Реализовал простое хранилище, которое при инициализации обращается вызывает сихронно данные из соседнего микросервиса. Далее эти данные используются при обработке запросов к API ```cs public class Storage { private static Random rand = new Random(); public static CompanyDal[] Companies { get; set; } public static List<EmployeeDal> Employees { get; set; } static Storage() { var client = new HttpClient(); string reqUrl = $"http://worker-1:8080/Companies/"; Companies = client.GetFromJsonAsync<CompanyDal[]>(reqUrl).Result;//для простоты блокируем Employees = new List<EmployeeDal>() { new EmployeeDal() { EmployeeId = Guid.NewGuid(), BirthDate = DateTime.Today.AddDays(-100), CompanyId = Companies[rand.Next(Companies.Length)].CompanyId, FullName = "Миронов Евгений Олегович", Position = "Ведущий разработчик" }, new EmployeeDal() { EmployeeId = Guid.NewGuid(), BirthDate = DateTime.Today.AddDays(-150), CompanyId = Companies[rand.Next(Companies.Length)].CompanyId, FullName = "Сидоров Петр Иванович", Position = "Уборщик" } }; } } ``` ## Реализация gateway при помощи nginx Добавил nginx.conf: ```conf server { listen 8080; listen [::]:8080; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /worker-1/ { proxy_pass http://worker-1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Prefix /worker-1; } location /worker-2/ { proxy_pass http://worker-2:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Prefix /worker-2; } } ``` Результат, после выполнения команды `docker-compose up`: Docker:  index.html на gateway-1:  worker-1:  worker-2: companyId - берется из другого приложения. Идентификаторы совпали -> все отработало корректно 