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 "")
|