112 lines
4.1 KiB
Markdown
112 lines
4.1 KiB
Markdown
|
# Лабораторная работа №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)
|