110 lines
3.9 KiB
Markdown
110 lines
3.9 KiB
Markdown
|
||
## Задание
|
||
|
||
Цель: изучение шаблона проектирования 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 |