# Отчет по лабораторной работе №3 ## Поставленные задачи 1. Создать 2 микросервиса, реализующих CRUD на связанных сущностях. 2. Реализовать механизм синхронного обмена сообщениями между микросервисами. 3. Реализовать шлюз на основе прозрачного прокси-сервера nginx. ## Предметная область Проект основан на системе управления стримами (трансляциями) и сообщениями. Каждый стрим представляет собой событие с такими параметрами, как название, время начала и окончания (окончание может быть null). Сообщения связаны с конкретными стримами и содержат следующие атрибуты: содержание, дата публикации, идентификатор стрима, к которому имеет отношение комментарий. Связь между сущностями один ко многим Два микросервиса выполняют раздельные функции: один управляет стримами, другой — сообщениями. Взаимодействие между ними происходит через HTTP-запросы. ## Запуск работы 1. Убедиться, что установлены необходимые технологии: - Docker: Платформа для контейнеризации приложений. - Docker Compose: Инструмент для запуска многоконтейнерных приложений на основе `docker-compose.yaml`. Обычно поставляется вместе с Docker. Чтобы проверить, установлена ли утилита, нужно запустить команду: ```bash docker-compose --version ``` 2. В директории, где находится файл `docker-compose.yaml`, выполнить следующую команду для запуска всех сервисов: ```bash docker-compose up --build ``` Эта команда сначала выполнит сборку, а затем запустит контейнеры. 3. После успешного запуска можно перейти к Swagger UI: - Message Swagger UI: [http://localhost/message-service/swagger/index.html](http://localhost/message-service/swagger/index.html#/). - Stream Swagger UI: [http://localhost/stream-service/swagger/index.html](http://localhost/message-service/swagger/index.html#/). 4. Stream сервис предоставляет следующие эндпоинты: - GET /streams — получить все стримы - POST /streams — создать новый стрим - GET /streams/{id} — получить стрим по ID - PUT /streams/{id} — обновить стрим по ID - DELETE /streams/{id} — удалить стрим по ID Message сервис предоставляет: - GET /messages — получить все сообщения - POST /messages — создать новое сообщение - GET /messages/{id} — получить сообщение по ID - GET /messages/all/{streamId} — получить все сообщения, которые относятся к streamId - PUT /messages/{id} — обновить сообщение по ID - DELETE /messages/{id} — удалить сообщение по ID ## Технологии 1. Golang: основной язык программирования для микросервисов. 2. PostgreSQL: база данных для хранения данных о стримах и сообщениях. 3. Docker & Docker Compose: для контейнеризации сервисов и удобного развертывания. 4. Swagger UI: для документации и тестирования API. 5. Nginx: для проксирования запросов между клиентом и микросервисами. 6. Gorilla Mux: маршрутизация запросов в Go. 7. Zerolog: логирование ошибок и действий. ## Архитектура Проект реализован на основе микросервисной архитектуры. Каждый сервис (Stream и Message) использует свою собственную базу данных (всего их две и в каждой БД по одной таблице) и предоставляет свои эндпоинты для работы с данными. Используются Docker и Docker Compose для управления окружением и запуска сервисов. ## Ход работы 1. **Микросервисная архитектура**: Проект разделен на два микросервиса: один для управления стримами, другой — для управления сообщениями. Каждый сервис имеет свой собственный набор функций, таблицы в базе данных и собственные эндпоинты для взаимодействия с клиентом. 2. **Реализация взаимодействия между микросервисами**: Stream-сервис предоставляет заголовки для стримов, которые затем использует Message-сервис для работы с сообщениями, привязанными к стримам. Взаимодействие реализовано через HTTP-запросы между сервисами. 3. **Использование Swagger**: Для каждого сервиса настроена Swagger-документация. Это позволяет визуализировать и тестировать API прямо в браузере, что упрощает разработку и тестирование. 4. **Докеризация проекта**: Все микросервисы и вспомогательные сервисы, такие как база данных и Nginx, запускаются через Docker Compose. Это упрощает управление зависимостями и разворачивание проекта. В коде присутствуют пояснительные комментарии. ## Демонстрационное видео Видеозапись доступна по адресу: [https://vk.com/video193898050_456240870](https://vk.com/video193898050_456240870)