DAS_2023_1/belyaeva_ekaterina_lab_3
2024-01-11 20:12:15 +04:00
..
disciplineService belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
learningPlanService belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
docker-compose.yml belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
img.png belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
lab3.mp4 belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
nginx.conf belyaeva lab3 ready 2024-01-11 20:12:15 +04:00
README.md belyaeva lab3 ready 2024-01-11 20:12:15 +04:00

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

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