"Explore With Me Cloud" - альтернативная реализация проекта "Explore With Me" с использованием Spring Cloud. Это бэкенд микросервисного приложения, предназначенного для планирования событий и создания групп для участия в различных мероприятиях.
Java 17, Spring Framework(Boot, Data, Cloud, Security), Hibernate(JPA), REST, Lombok, Liquibase, PostgreSQL, RabbitMQ, OAuth2, Keycloak, Maven, Postman
Проект организован на основе микросервисов, каждый из которых выполняет определенные функции. Дополнительные модули, такие как Eureka Server
, Config Service
, и Gateway Service
, помогают обеспечить эффективное взаимодействие между микросервисами и управление настройками.
Каждый из модулей является отдельным микросервисом и имеет свою собственную базу данных для хранения информации. Это позволяет масштабировать и разрабатывать каждый сервис независимо, что делает приложение более гибким и эффективным.
Этот сервис отвечает за управление пользователями в системе. Он предоставляет API для регистрации новых пользователей, аутентификации, обновления профилей пользователей и многое другое. Важная часть этого сервиса - это управление данными пользователей, их авторизация и безопасность.
Этот сервис занимается созданием и управлением подборками мероприятий. Подборки могут быть тематическими, событийными или какими-либо другими категориями мероприятий. Пользователи могут создавать и редактировать подборки, добавлять мероприятия в них и делиться ими с другими пользователями.
Этот сервис обеспечивает управление запросами от пользователей, желающих участвовать в конкретных мероприятиях из подборок. Пользователи могут отправлять запросы на участие, а организаторы мероприятий могут принимать или отклонять эти запросы.
Этот сервис предоставляет возможность пользователям подписываться на других пользователей и получать уведомления о событиях и активностях, связанных с их друзьями. Это способствует социальной взаимосвязи в приложении и позволяет пользователям быть в курсе событий, которые интересны их друзьям.
Этот сервис отвечает за создание, редактирование и управление мероприятиями. Пользователи могут создавать мероприятия различных типов, например, выставки, спортивные мероприятия, походы в кино и многое другое. Сервис также предоставляет информацию о доступных мероприятиях, и пользователи могут искать и присоединяться к ним.
Микросервисы взаимодействуют между собой при помощи OpenFeign и RabbitMQ, что обеспечивает эффективную и прозрачную коммуникацию между различными компонентами системы, а также делает приложение более масштабируемым и поддерживаемым.
OpenFeign - это декларативный HTTP-клиент, который позволяет удобно вызывать удаленные методы в других микросервисах. Каждый микросервис может использовать OpenFeign для вызова методов, предоставляемых другими микросервисами, и обмениваться данными.
RabbitMQ используется для асинхронной обработки событий и оповещений в приложении. Это позволяет быстро распространять информацию о новых событиях, участниках и запросах между микросервисами. Например, при создании нового события или подтверждении участия в событии, информация передается через RabbitMQ, что позволяет быстро информировать заинтересованных пользователей.
- Создать сервис для получения настроек с GitHub.
- Создать сервис EurekaServer - реестр сервисов для организации динамической регистрации и обнаружения микросервисов.
- Создать сервис Spring Gateway - маршрутизатор для перенаправления запросов к соответствующим микросервисам.
- Перенести функционал из исходного проекта "Explore With Me".
- Проверить работу и запуск тестов (при необходимости поправить).
- Добавить Liquibase для управления миграциями базы данных.
- Разделить основной функционал на микросервисы:
- Сервис управления пользователями.
- Сервис управления подборками мероприятий.
- Сервис управления запросами на участие в мероприятии.
- Сервис подписки на друзей.
- Сервис управления мероприятиями и т.д.
- Для каждого микросервиса создать отдельную базу данных.
- Добавить работу с RabbitMQ или Kafka:
- Реализовать оповещения о новых событиях.
- Реализовать подтверждение участия и уведомления о новых участниках.
- Реализовать уведомление о запросе на дружбу, подтверждение/отклонение запроса на дружбу.
- Внедрить Spring Security для обеспечения безопасности приложения.
- Настройка мониторинга:
- настроить сбор метрик приложения с использованием Prometheus
- настроить визуализацию данных с помощью Grafana для мониторинга производительности и состояния приложения.
- Внедрение паттернов отказоустойчивости:
- Circuit Breaker: Применение паттерна "Circuit Breaker" для обработки сбоев и автоматического перехода к режиму отказа при возникновении серийных сбоев во взаимодействии с другими сервисами.
- Bulkhead: Реализация паттерна "Bulkhead" для изоляции частей системы и предотвращения распространения сбоев на другие компоненты.
- Rate Limiter: Внедрение паттерна "Rate Limiter" для контроля над частотой обращения к ресурсам и предотвращения перегрузки системы.
- Retry: Создание механизма "Retry" для повторных попыток выполнения операций при временных сбоях.
Для обеспечения асинхронной обработки событий и оповещений в приложении внедрено RabbitMQ:
-
Оповещения о новых событиях: Когда пользователь создает новое событие, информация о событии отправляется в RabbitMQ. Это позволяет заинтересованным пользователям быстро узнавать о новых событиях и реагировать на них.
-
Подтверждение участия и уведомления о новых участниках: Если пользователь решает присоединиться к событию, его решение также отправляется в RabbitMQ. Организаторы события или другие участники могут получать уведомления о новых участниках.
-
Запросы на дружбу и уведомление о подтверждении/отклонении запроса:Запросы на установление дружеских связей и уведомления о подтверждении или отклонении этих запросов также осуществляются через RabbitMQ. При создании запроса на установление дружбы информация о нем передается через RabbitMQ, а решение пользователя о его подтверждении или отклонении также обрабатывается с использованием RabbitMQ.
Для обеспечения безопасности в бэкенд-части приложения "Explore With Me Cloud", использовались следующие средства:
-
Spring Security и JWT-аутентификация: Spring Security гарантирует безопасность приложения, позволяя только аутентифицированным пользователям получать доступ к защищенным ресурсам. Для аутентификации используется JWT (JSON Web Token), который обеспечивает безопасное подтверждение идентификации пользователя.
-
JWT-авторизация: Spring Security позволяет управлять авторизацией пользователей на основе их ролей и прав, что делает систему более гибкой. JWT-токены содержат информацию о ролях пользователя, и это используется для определения доступных действий и ресурсов.
-
Интеграция OAuth2 и Keycloak: Для дополнительного уровня безопасности интегрированы OAuth2 и Keycloak. Keycloak предоставляет удобное управление идентификацией и авторизацией пользователей, а Spring Security и JWT-токены обогащают эту систему безопасности.
-
Защита ресурсов: Spring Security и JWT-токенов обеспечивают защиту различных ресурсов и API, гарантируя доступ только аутентифицированным и авторизованным пользователям.
Исходный проект "Explore With Me" доступен здесь.