DAS_2023_1/martysheva_tamara_lab_3/README.md

106 lines
5.4 KiB
Markdown
Raw Normal View History

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 клиента мы получаем его данные. Пример с методом создания тренировки:
![](images/message.jpg "")
### 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 #изолированная сеть
```
***
## *Результат:*
![](images/result-dockerhub.jpg "")
![](images/result-swagger-client.jpg "")
![](images/result-swagger-training.jpg "")