## Задание Цель: изучение шаблона проектирования gateway, построения синхронного обмена между микросервисами и архитектурного стиля RESTful API. Задачи: - Создать 2 микросервиса, реализующих CRUD на связанных сущностях. - Реализовать механизм синхронного обмена сообщениями между микросервисами. - Реализовать шлюз на основе прозрачного прокси-сервера nginx. ## Ход работы ### Разворачивание сервисов: Были разработаны два приложения на Java с использованием средства автоматизации сборки проектов Gradle и с использованием библиотеки spring-boot: - categoryService - работа с дисциплинами (crud) - productService - работа с продуктами (crud). При создании продукта выбирается id категории, и через nginx и rest template происходит получение данных о категории с этим id ### Обмен сообщениями При создании плана обучения выбирается id категории, и через nginx и rest template происходит получение данных о категории с этим id ### 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/lab3-0.0.1-SNAPSHOT.jar"] ``` ### docker-compose.yml Файл, соединяющий сервисы (содержащий настройку Docker): ``` version: "3" #формат конфигурации Docker Compose версии 3 services: #определение сервисов category: build: context: /categoryService #путь к контексту сборки dockerfile: Dockerfile #имя докерфайла ports: - "8089:8089" #проброс портов networks: - netwrk #сеть product: build: context: /productService #путь к контексту сборки 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: #зависимость от сервисов - category - product networks: netwrk: driver: bridge #изолированная сеть ``` ### nginx.conf Настройка nginx: ``` http { server { listen 80; listen [::]:80; server_name localhost; location /categoryService/ { proxy_pass http://category:8089/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Prefix /categoryService; } location /productService/ { proxy_pass http://product:8090/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Prefix /productService; } } } events { worker_connections 1024; } ``` ## Результат Видео: https://disk.yandex.ru/d/8Lcvb0H9LPNSKw