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