5.4 KiB
5.4 KiB
Лабораторная работа №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 #изолированная сеть