Приложение-афиша, позволяющее пользователям делиться информацией об интересных событиях и находить компанию для участия в них.
Explore With Me — это платформа для организации и участия в различных событиях. Пользователи могут создавать события, регистрироваться на них, формировать подборки и оставлять комментарии.
Проект построен на микросервисной архитектуре с использованием Spring Cloud и включает следующие компоненты:
-
Discovery Server (
discovery-server) — сервис регистрации и обнаружения микросервисов на базе Eureka- Порт:
8761 - URL: http://localhost:8761
- Порт:
-
Config Server (
config-server) — централизованный сервис конфигурации- Динамический порт (Eureka)
- Хранит конфигурации всех микросервисов
-
Gateway Server (
gateway-server) — API Gateway на базе Spring Cloud Gateway- Порт:
8080 - Единая точка входа для всех клиентских запросов
- URL: http://localhost:8080
- Порт:
-
User Service (
user-service) — управление пользователями- Динамический порт (Eureka)
- База данных:
ewm_main_db(PostgreSQL)
-
Event Service (
event-service) — управление событиями, категориями и подборками- Динамический порт (Eureka)
- База данных:
ewm_main_db(PostgreSQL)
-
Request Service (
request-service) — управление запросами на участие в событиях- Динамический порт (Eureka)
- База данных:
ewm_main_db(PostgreSQL)
-
Comment Service (
comment-service) — управление комментариями к событиям- Динамический порт (Eureka)
- База данных:
ewm_main_db(PostgreSQL)
-
Stats Server (
stats-server) — сервис статистики просмотров событий- Порт:
9090 - База данных:
ewm_stats_db(PostgreSQL)
- Порт:
- ewm_user_db (PostgreSQL) — база данных сервиса пользователей
- Порт:
5433 - Используется:
user-service
- Порт:
- ewm_event_db (PostgreSQL) — база данных сервиса событий
- Порт:
5434 - Используется:
event-service
- Порт:
- ewm_request_db (PostgreSQL) — база данных сервиса запросов
- Порт:
5435 - Используется:
request-service
- Порт:
- ewm_comment_db (PostgreSQL) — база данных сервиса комментариев
- Порт:
5436 - Используется:
comment-service
- Порт:
- ewm_stats_db (PostgreSQL) — база данных сервиса статистики
- Порт:
6543 - Используется:
stats-server
- Порт:
Все конфигурации сервисов находятся в централизованном хранилище.
Каждый сервис также имеет локальный application.yaml в src/main/resources/, который содержит:
- Настройки подключения к Config Server
- Настройки подключения к Eureka
- Имя приложения
Взаимодействие между микросервисами осуществляется через FeignClient из модуля interaction-api. Все клиенты находятся в пакете ru.practicum.client и используют Circuit Breaker для отказоустойчивости.
Все FeignClient имеют fallback-реализации для обработки ошибок:
Все FeignClient используют Circuit Breaker (Resilience4j) с настройками:
connectTimeout: 5000msreadTimeout: 5000ms- Автоматическое переключение на fallback при ошибках
- Управление пользователями — создание, получение, удаление пользователей
- Управление категориями — создание, редактирование, удаление категорий событий
- Управление событиями — создание, редактирование, публикация, поиск событий
- Управление запросами — подача заявок на участие, подтверждение/отклонение заявок
- Управление подборками — создание подборок событий, добавление/удаление событий
- Статистика просмотров — отслеживание количества просмотров событий
- Система комментариев — создание, редактирование, модерация комментариев
Для пользователей:
- Создание комментариев к событиям
- Редактирование своих комментариев (только в статусе PENDING)
- Удаление своих комментариев
- Просмотр комментариев к событиям
Для администраторов:
- Модерация комментариев (подтверждение/отклонение)
- Поиск комментариев по различным критериям:
- Статус (PENDING, CONFIRMED, REJECTED)
- ID события
- ID автора
- Временной диапазон
- Удаление любых комментариев
- Редактирование комментариев
Статусы комментариев:
PENDING— ожидает модерацииCONFIRMED— подтвержден администраторомREJECTED— отклонен администратором
- Backend: Java 21, Spring Boot 3.3.0
- Microservices: Spring Cloud (Gateway, Config Server, Eureka, OpenFeign)
- Database: PostgreSQL 16.1
- ORM: Spring Data JPA, Hibernate
- Build Tool: Maven
- Containerization: Docker, Docker Compose
- Code Quality: Checkstyle, SpotBugs, JaCoCo
- Resilience: Resilience4j (Circuit Breaker)
- Docker и Docker Compose
- Java 21
- Maven 3.6+
# Запуск баз данных
docker-compose up -d
# Сборка проекта
mvn clean install -DskipTests
# Запуск сервисов (в отдельных терминалах или через IDE):
# 1. Discovery Server
# 2. Config Server
# 3. Gateway Server
# 4. User Service
# 5. Event Service
# 6. Request Service
# 7. Comment Service
# 8. Stats Server- Gateway Server: http://localhost:8080
- Discovery Server (Eureka): http://localhost:8761
- Stats Server: http://localhost:9090
- Main DB: localhost:5432
- Stats DB: localhost:6543
Все запросы к API выполняются через Gateway Server на порту 8080.
GET /events— получение списка событий с фильтрациейGET /events/{eventId}— получение события по IDGET /events/{eventId}/comments— получение комментариев к событию
GET /categories— получение списка категорийGET /categories/{catId}— получение категории по ID
GET /compilations— получение списка подборокGET /compilations/{compId}— получение подборки по ID
POST /users/{userId}/events— создание событияGET /users/{userId}/events— получение событий пользователяGET /users/{userId}/events/{eventId}— получение события пользователяPATCH /users/{userId}/events/{eventId}— обновление событияPOST /users/{userId}/events/{eventId}— публикация события
POST /users/{userId}/requests?eventId={eventId}— создание запроса на участиеGET /users/{userId}/requests— получение запросов пользователяPATCH /users/{userId}/requests/{requestId}/cancel— отмена запроса
POST /users/{userId}/events/{eventId}/comments— создание комментарияPATCH /users/{userId}/comments/{commentId}— обновление комментарияDELETE /users/{userId}/comments/{commentId}— удаление комментария
POST /admin/users— создание пользователяGET /admin/users— получение списка пользователейGET /admin/users/{userId}— получение пользователя по IDDELETE /admin/users/{userId}— удаление пользователя
POST /admin/categories— создание категорииPATCH /admin/categories/{catId}— обновление категорииDELETE /admin/categories/{catId}— удаление категории
GET /admin/events— поиск событийPATCH /admin/events/{eventId}— обновление событияPATCH /admin/events/{eventId}/publish— публикация событияPATCH /admin/events/{eventId}/reject— отклонение события
POST /admin/compilations— создание подборкиPATCH /admin/compilations/{compId}— обновление подборкиDELETE /admin/compilations/{compId}— удаление подборки
GET /admin/comments— поиск комментариев (с фильтрами)PATCH /admin/comments/{commentId}— модерация комментарияDELETE /admin/comments/{commentId}— удаление комментария
Все запросы выполняются через Gateway Server (http://localhost:8080):
- Публичный API:
/events,/categories,/compilations,/events/{eventId}/comments - Приватный API:
/users/{userId}/events,/users/{userId}/requests,/users/{userId}/comments - Административный API:
/admin/users,/admin/categories,/admin/events,/admin/compilations,/admin/comments,/admin/requests
- Централизованная конфигурация — все настройки сервисов хранятся в Config Server
- Service Discovery — автоматическое обнаружение сервисов через Eureka
- API Gateway — единая точка входа для всех клиентских запросов
- Circuit Breaker — отказоустойчивость при взаимодействии между сервисами
- Fallback механизмы — Приложение устойчиво к сбоям в работе сервисов
- Добавить конфигурацию в
infra/config-server/src/main/resources/config/ - Зарегистрировать сервис в Eureka
- Добавить маршрут в Gateway (если нужен внешний доступ)
- При необходимости добавить FeignClient в
interaction-api
Проект создан в рамках учебного курса YandexPracticum(JavaDeveloper(расширенный курс)).