distributed-computing/tasks/mironov-eo/lab_3/README.md
2023-12-04 23:02:10 +03:00

105 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Отчет по лабораторной работе №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 обоих приложений:
![](pic/1.png)
![](pic/2.png)
## Реализация синхронного обмена
Реализовал простое хранилище, которое при инициализации обращается вызывает сихронно данные из соседнего микросервиса.
Далее эти данные используются при обработке запросов к 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:
![](pic/3.png)
index.html на gateway-1:
![](pic/4.png)
worker-1:
![](pic/5.png)
worker-2:
companyId - берется из другого приложения. Идентификаторы совпали -> все отработало корректно
![](pic/6.png)