# Лабораторная работа №3 ## Задание Цель: изучение шаблона проектирования gateway, построения синхронного обмена между микросервисами и архитектурного стиля RESTful API. Задачи: - Создать 2 микросервиса, реализующих CRUD на связанных сущностях. - Реализовать механизм синхронного обмена сообщениями между микросервисами. - Реализовать шлюз на основе прозрачного прокси-сервера nginx. ## Ход работы ### Разворачивание сервисов: Были разработаны два приложения на Java с использованием средства автоматизации сборки проектов Gradle и с использованием библиотеки spring-boot: - disciplineService - работа с дисциплинами (crud) - learningPlanService - работа с планами обучения (crud). При создании плана обучения выбирается id дисциплины, и через nginx и rest template происходит получение данных о дисциплины с этим id ### Обмен сообщениями При создании плана обучения выбирается id дисциплины, и через nginx и rest template происходит получение данных о дисциплины с этим id ![img.png](img.png) ### 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: #определение сервисов discipline: build: context: /disciplineService #путь к контексту сборки dockerfile: Dockerfile #имя докерфайла ports: - "8089:8089" #проброс портов networks: - netwrk #сеть learning_plan: build: context: /learningPlanService #путь к контексту сборки 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: #зависимость от сервисов - discipline - learning_plan networks: netwrk: driver: bridge #изолированная сеть ``` ### nginx.conf Настройка nginx: ``` http { server { listen 80; listen [::]:80; server_name localhost; location /disciplineService/ { proxy_pass http://discipline: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 /disciplineService; } location /learningPlanService/ { proxy_pass http://learning_plan: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 /learningPlanService; } } } events { worker_connections 1024; } ``` ## Результат Работоспособность и взаимодействие сервисов показаны в видео: [lab3.mp4](lab3.mp4)