106 lines
5.4 KiB
Markdown
106 lines
5.4 KiB
Markdown
|
# Лабораторная работа №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 "")
|