DAS_2023_1/martysheva_tamara_lab_3
2023-12-15 12:05:54 +04:00
..
client martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
images martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
training martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
docker-compose.yml martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
nginx.conf martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
README.md martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00
video.mkv martysheva_tamara_lab_3 is ready 2023-12-15 12:05:54 +04:00

Лабораторная работа №3 - REST API, Gateway и синхронный обмен между микросервисами

Цель: изучение шаблона проектирования gateway, построения синхронного обмена между микросервисами и архитектурного стиля RESTful API.

Задачи:

  • Создать 2 микросервиса, реализующих CRUD на связанных сущностях.
  • Реализовать механизм синхронного обмена сообщениями между микросервисами.
  • Реализовать шлюз на основе прозрачного прокси-сервера nginx.

Ход работы:

Разворачивание сервисов:

Были разработаны два приложения на ЯП Java с использованием средства автоматизации сборки проектов Gradle и с использованием библиотеки spring-boot:

  • client - содержит работу с записями по пользователям мобильного приложения для поддержки здоровья.
  • training - содержит работу с записями по тренировкам пользователей. Каждая тренировка относится к единственному пользователю, у пользователя может быть много тренировок (связь многие к одному).

Обмен сообщениями

При чтении (создании, обновлении) записи тренировки при помощи RestTemplate по id клиента мы получаем его данные. Пример с методом создания тренировки:

Dockerfile

Были созданы идентичные докер-файлы для приложений :

FROM openjdk:17 #базовый образ
RUN mkdir -p /usr/src/app/ #создание директории
WORKDIR /usr/src/app/ #установка рабочей директории проекта
COPY . /usr/src/app/ #копирование файлов с хоста в контейнер
RUN ./gradlew clean build #сборка проекта
EXPOSE 8089 #объявление порта
ENTRYPOINT ["java","-jar","build/libs/labIP-0.0.1-SNAPSHOT.jar"] #точка входа для контейнера

nginx.conf

Были созданы идентичные докер-файлы для приложений :

http {
    server {
        listen 80; #запросы по порту 80 для IPv4
        listen [::]:80; #запросы по порту 80 для IPv6
        server_name localhost; #имя сервера

        location /client/ {  #настройки для запросов, поступающих по пути /client/
            proxy_pass http://client:8089/; #прокси-перенаправление на адрес
            proxy_set_header Host $host; #установка дополнительных HTTP-заголовков
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Prefix /client;
        }

        location /training/ { #настройки для запросов, поступающих по пути /training/ 
            proxy_pass http://training:8090/; #прокси-перенаправление на адрес
            proxy_set_header Host $host; #установка дополнительных HTTP-заголовков
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Prefix /training;
        }
    }
}

events {
    worker_connections  1024; #максимальное количество одновременных соединений для каждого рабочего процесса
}

docker-compose.yml

Был создан файл docker-compose.yml для разворачивания сервисов:

version: "3" #формат конфигурации Docker Compose версии 3
services: #определение сервисов
  client:
    build:
      context: /client #путь к контексту сборки
      dockerfile: Dockerfile #имя докерфайла
    ports:
      - "8089:8089" #проброс портов
    networks: 
      - netwrk #сеть
    
  training:
    build:
      context: /training #путь к контексту сборки
      dockerfile: Dockerfile #имя докерфайла
    ports:
      - "8090:8090" #проброс портов
    networks: 
      - netwrk #сеть

  nginx:
    image: nginx:latest #образ для контейнера
    ports:
      - "8091:80" #проброс портов
    networks: 
      - netwrk #сеть
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf #монтирует локальный файл конфигурации
    depends_on: #зависимость от сервисов
      - client
      - training

networks:
  netwrk:
    driver: bridge #изолированная сеть

Результат: