DAS_2023_1/martysheva_tamara_lab_3/README.md

106 lines
5.4 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 - 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 "")