distributed-computing/tasks/khalitova-am/lab_3/README.md
2023-12-18 09:47:42 +04:00

4.6 KiB
Raw Blame History

Отчёт по лабораторной работе №3

REST API, Gateway и синхронный обмен между микросервисами

Выполнила: студентка гр. ИСЭбд-41 Халитова А.М.

Создание микросервисов

В терминале помощью команд dotnet new web -n worker-1 и dotnet new web -n worker-2создано два микросервиса:

Код программы worker-1

Код программы worker-2

Далее были добавлены Swagger и OpenAi в проекты. Затем запустили приложения с помощью команды dotnet run.

Интерфейс микросервисов c CRUD-операциями - список записей, подробности конкретной записи, создание, удаление и изменение записи: worker-1: worker-2:

Реализация синхронного обмена

Синхронный вызов данных с соседнего микросервиса для worker-2 при реализации получения, создания и обновления работ:

app.MapGet("/getJobs/{clientId}", (string clientId) =>
{
    var secondWorkerResponse = httpClient.GetStringAsync("http://worker-1:8080/getClient/" + clientId).Result;
    Client client = JsonConvert.DeserializeObject<Client>(secondWorkerResponse);
    if (secondWorkerResponse == null)
        return Results.NotFound(new { message = "Клиент не найден" });
    List<Job> clientJobs = jobs.Where(x => x.ClientId == clientId).ToList();
    return Results.Json(clientJobs);
})
 .WithName("GetJobs");

app.MapGet("getJob/{id}", (string id) =>
{
    Job? job = jobs.FirstOrDefault(x => x.Id == id);
    if (job == null)
        return Results.NotFound(new { message = "Задача не найдена" });
    return Results.Json(job);
})
    .WithName("GetJob");

app.MapPost("createJob", (JobViewModel jobVM) =>
{
    var secondWorkerResponse = httpClient.GetStringAsync("http://worker-1:8080/getClient/" + jobVM.ClientId).Result;
    Client client = JsonConvert.DeserializeObject<Client>(secondWorkerResponse);
    if (secondWorkerResponse == null)
        return Results.NotFound(new { message = "Клиент не найден" });
    Job job = new Job
    {
        Id = Guid.NewGuid().ToString(),
        DeadLine = jobVM.DeadLine,
        Description = jobVM.Description,
        Client = client,
        ClientId = jobVM.ClientId,
        Title = jobVM.Title,
    };
    jobs.Add(job);
    return Results.Json(job);
})
 .WithName("CreateJob");

app.MapPut("updateJob/{id}", (string id, JobViewModel data) =>
{
    Job? job = jobs.FirstOrDefault(x => x.Id == id);
    if (job == null)
        return Results.NotFound(new { message = "Задача не найдена" });
var secondWorkerResponse = httpClient.GetStringAsync("http://worker-1:8080/getClient/" + data.ClientId).Result;
    Client client = JsonConvert.DeserializeObject<Client>(secondWorkerResponse);
    if (secondWorkerResponse == null)
        return Results.NotFound(new { message = "Клиент не найден" });
    job.Title = data.Title;
    job.DeadLine = data.DeadLine;
    job.ClientId = data.ClientId;
    job.Client = client;
    job.Description = data.Description;
    return Results.Json(job);
})
    .WithName("UpdateJob");

Реализация gateway при помощи nginx

Файл с настройкой nginx:

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 --build.

В Docker Desktop проверили, что приложение успешно запущено:

Страница index.html на шлюзе geteway-1:

worker-1:

worker-2: