DAS_2023_1/kutygin_andrey_lab_3
2024-01-16 12:10:49 +04:00
..
.idea kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
categoryService kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
productService kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
docker-compose.yml kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
img.png kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
lab3.mp4 kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
nginx.conf kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00
README.md kutygin_andrey_lab_3_ready 2024-01-16 12:10:49 +04:00

Задание

Цель: изучение шаблона проектирования 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