|
| 1 | +# Explore-with-me |
| 2 | + |
| 3 | +## Introduction |
| 4 | + |
| 5 | +Explore-with-me - это платформа, позволяющая пользователям создавать мероприятия, управлять ими и участвовать в них. Приложение перешло на **микросервисную архитектуру** для улучшения масштабируемости, отказоустойчивости и гибкости разработки. |
| 6 | + |
| 7 | +Ключевые компоненты архитектуры: |
| 8 | +* **Config Server**: Централизованное управление конфигурациями для всех микросервисов. |
| 9 | +* **Discovery Server (Eureka)**: Обеспечивает регистрацию и обнаружение сервисов в сети. |
| 10 | +* **Gateway Server**: Единая точка входа для всех клиентских запросов, выполняет маршрутизацию к соответствующим микросервисам. |
| 11 | +* **Event Service**: Отвечает за логику, связанную с мероприятиями (создание, поиск, управление). |
| 12 | +* **User Service**: Управляет данными пользователей и их аутентификацией/авторизацией. |
| 13 | +* **Request Service**: Обрабатывает запросы на участие в мероприятиях. |
| 14 | +* **Stats Service**: Система сбора и анализа статистики, разделенная на: |
| 15 | + * **Collector**: Принимает и сохраняет информацию о просмотрах и обращениях к эндпоинтам. |
| 16 | + * **Aggregator**: Агрегирует собранные данные для последующего анализа. |
| 17 | + * **Analyzer**: Анализирует агрегированные данные для формирования рекомендаций пользователям. |
| 18 | + |
| 19 | +Взаимодействие между сервисами осуществляется с помощью **Feign клиентов**. |
| 20 | + |
| 21 | +## Technologies Used |
| 22 | + |
| 23 | +- **Spring Boot**: Основа для создания микросервисов. |
| 24 | +- **Spring Cloud**: |
| 25 | + - **Spring Cloud Config**: Для `config-server`. |
| 26 | + - **Spring Cloud Netflix Eureka** (или **Consul**): Для `discovery-server`. |
| 27 | + - **Spring Cloud Gateway**: Для `gateway-server`. |
| 28 | + - **OpenFeign**: Для декларативного REST-взаимодействия между сервисами. |
| 29 | +- **REST**: Для API коммуникации. |
| 30 | +- **Docker & Docker Compose**: Для контейнеризации и оркестрации окружения. |
| 31 | +- **PostgreSQL**: В качестве основной базы данных для сервисов (где это необходимо). |
| 32 | +- **Lombok**: Для уменьшения шаблонного кода. |
| 33 | +- **SLF4J**: Для логирования. |
| 34 | + |
| 35 | +## Service Overview |
| 36 | + |
| 37 | +Проект состоит из следующих основных микросервисов: |
| 38 | + |
| 39 | +- **config-server**: Сервер конфигураций. |
| 40 | +- **discovery-server**: Сервер регистрации и обнаружения сервисов. |
| 41 | +- **gateway-server**: API шлюз, маршрутизирующий запросы. |
| 42 | +- **event-service**: Сервис управления событиями. |
| 43 | +- **user-service**: Сервис управления пользователями. |
| 44 | +- **request-service**: Сервис управления запросами на участие. |
| 45 | +- **collector**: Сервис сбора статистики. |
| 46 | +- **aggregator**: Сервис агрегации статистики. |
| 47 | +- **analyzer**: Сервис анализа статистики и формирования рекомендаций. |
| 48 | + |
| 49 | +## Setup and Installation |
| 50 | + |
| 51 | +### Prerequisites |
| 52 | + |
| 53 | +- Java 21+ |
| 54 | +- Maven |
| 55 | +- Docker |
| 56 | +- Docker Compose |
| 57 | + |
| 58 | +### Installation Steps |
| 59 | + |
| 60 | +1. **Clone the Repository** |
| 61 | + |
| 62 | + ```bash |
| 63 | + git clone https://github.com/yiqes/java-plus-graduation.git |
| 64 | + cd java-plus-graduation |
| 65 | + ``` |
| 66 | + |
| 67 | +2. **Build the Project Modules** |
| 68 | + |
| 69 | + ```bash |
| 70 | + mvn clean install |
| 71 | + ``` |
| 72 | + |
| 73 | +3. **Running with Docker Compose (Recommended)** |
| 74 | + |
| 75 | + - Убедитесь, что Docker и Docker Compose установлены. |
| 76 | + - Перейдите в корневую директорию проекта, где находится `docker-compose.yml`. |
| 77 | + - Запустите: |
| 78 | + |
| 79 | + ```bash |
| 80 | + docker-compose up --build |
| 81 | + ``` |
| 82 | + Это поднимет все сконфигурированные сервисы, включая `config-server`, `discovery-server` и базы данных. |
| 83 | + |
| 84 | +4. **Running Without Docker (More Complex)** |
| 85 | + |
| 86 | + - Запустите `config-server`. |
| 87 | + - Запустите `discovery-server`. Убедитесь, что он регистрируется в `config-server` для получения своей конфигурации. |
| 88 | + - Запустите остальные микросервисы (`event-service`, `user-service`, `request-service`, `stats-collector`, `stats-aggregator`, `stats-analyzer`). Они должны регистрироваться в `discovery-server` и получать конфигурацию из `config-server`. |
| 89 | + - Запустите `gateway-server`. Он будет использовать `discovery-server` для маршрутизации запросов. |
| 90 | + - Для каждого сервиса необходимо настроить подключение к базе данных (если используется) в его `bootstrap.properties` (для подключения к config-server) и `application.properties` (или получать из config-server). |
| 91 | + - Запуск каждого сервиса: |
| 92 | + ```bash |
| 93 | + # Пример для event-service |
| 94 | + # java -jar event-service/target/event-service.jar |
| 95 | + ``` |
| 96 | + |
| 97 | +## API Documentation |
| 98 | + |
| 99 | +Все API запросы должны направляться через **Gateway Server**, который обычно доступен по адресу `http://localhost:8080` (или порт, указанный в вашей конфигурации `gateway-server`). Gateway автоматически маршрутизирует запросы к соответствующим микросервисам. |
| 100 | + |
| 101 | +**Эндпоинты остались теми же, что и в монолитной версии.** |
| 102 | + |
| 103 | +### Admin API Endpoints (через Gateway) |
| 104 | + |
| 105 | +- **POST /admin/categories** |
| 106 | + - Создает новую категорию. |
| 107 | + - Request Body: `NewCategoryDto` |
| 108 | + - *Маршрутизируется на `event-service`* |
| 109 | + |
| 110 | +- **GET /admin/compilations** |
| 111 | + - Получает подборки событий. |
| 112 | + - Query Params: `pinned`, `from`, `size` |
| 113 | + - *Маршрутизируется на `event-service`* |
| 114 | + |
| 115 | +- **POST /admin/events** (и другие PATCH, GET эндпоинты для событий) |
| 116 | + - Создает/обновляет/получает события (администратор). |
| 117 | + - Request Body: `NewEventDto` / `UpdateEventAdminRequest` |
| 118 | + - *Маршрутизируется на `event-service`* |
| 119 | + |
| 120 | +- **GET /admin/users** (и другие эндпоинты для управления пользователями) |
| 121 | + - Получает пользователей. |
| 122 | + - Query Params: `ids`, `from`, `size` |
| 123 | + - *Маршрутизируется на `user-service`* |
| 124 | + |
| 125 | +### Public API Endpoints (через Gateway) |
| 126 | + |
| 127 | +- **GET /categories** |
| 128 | + - Получает категории. |
| 129 | + - Query Params: `from`, `size` |
| 130 | + - *Маршрутизируется на `event-service`* |
| 131 | + |
| 132 | +- **GET /compilations** |
| 133 | + - Получает подборки событий. |
| 134 | + - Query Params: `pinned`, `from`, `size` |
| 135 | + - *Маршрутизируется на `event-service`* |
| 136 | + |
| 137 | +- **GET /events** |
| 138 | + - Получает события (публичный доступ). |
| 139 | + - Query Params: `text`, `categories`, `paid`, `rangeStart`, `rangeEnd`, `onlyAvailable`, `sort`, `from`, `size` |
| 140 | + - *Маршрутизируется на `event-service`* |
| 141 | + |
| 142 | +### Private API Endpoints (через Gateway) |
| 143 | + |
| 144 | +- **POST /users/{userId}/events** (и другие эндпоинты для событий пользователя) |
| 145 | + - Создает событие для пользователя. |
| 146 | + - Request Body: `NewEventDto` |
| 147 | + - *Маршрутизируется на `event-service` (с проверкой пользователя через `user-service` или передачей `userId`)* |
| 148 | + |
| 149 | +- **GET /users/{userId}/requests** (и другие эндпоинты для запросов пользователя) |
| 150 | + - Получает запросы на участие для событий пользователя. |
| 151 | + - *Маршрутизируется на `request-service` (с проверкой пользователя)* |
| 152 | + |
| 153 | +## Usage Examples |
| 154 | + |
| 155 | +### Getting an event with provided id & user-id from header (через Gateway) |
| 156 | + |
| 157 | +```bash |
| 158 | +curl -X GET "http://localhost:8080/123" \ |
| 159 | + -H "X-Ewm-User-Id: 456" |
0 commit comments