Система из двух независимых RESTful веб-сервисов, реализующих бэкенд для платформы "Умный дом" и связанного с ней E-commerce магазина.
Этот проект демонстрирует применение различных архитектурных подходов для решения разных бизнес-задач в рамках одной системы:
- Чистая архитектура (DDD/Hexagonal): Модуль
commerceпостроен с использованием принципов Гексагональной архитектуры. Бизнес-логика (домен) полностью изолирована от внешних зависимостей (фреймворки, базы данных), что делает код легко тестируемым, гибким и долговечным. - Асинхронное взаимодействие через Kafka: Модуль
telemetryиспользует Apache Kafka для приема и обработки потока данных от сенсоров. Это обеспечивает отказоустойчивость и масштабируемость системы телеметрии, позволяя обрабатывать высокие нагрузки без потери данных. - Высокопроизводительный протокол gRPC: Взаимодействие с устройствами (сенсорами) реализовано через gRPC, что гарантирует строгие контракты API (Protobuf) и высокую производительность по сравнению с традиционным REST.
- Паттерны Spring Cloud (Microservices Foundation): Система построена на проверенных временем микросервисных паттернах: Service Discovery (Eureka) для динамического обнаружения сервисов, Cloud Config для централизованного управления конфигурацией и API Gateway для унификации точки входа.
Бизнес-функции системы реализуются двумя логическими модулями commerce и telemetry, которые могут быть развернуты и масштабированы независимо друг от друга. Модуль infra реализует паттерны Cloud Config, Service Discovery и API Gateway.
graph TD
subgraph "Внешние системы"
Sensor[Устройство/Сенсор]
User[Пользователь]
end
subgraph "Модуль Телеметрии"
TelemetryService[telemetry services]
Kafka[Брокер сообщений Kafka]
TelemetryDB[(PostgreSQL)]
end
subgraph "Модуль E-commerce (Гексагональная архитектура)"
CommerceService[commerce services]
CommerceDB[(PostgreSQL)]
end
subgraph "Инфраструктура"
InfraService[infra services]
end
Sensor -- gRPC --> TelemetryService
TelemetryService -- Отправляет/Читает события --> Kafka
TelemetryService -- Сохраняет/Читает данные <--> TelemetryDB
User -- REST API --> CommerceService
CommerceService -- Сохраняет/Читает данные <--> CommerceDB
InfraService --> CommerceService
InfraService --> TelemetryService
style Kafka fill:#231F20,stroke:#FFF,stroke-width:2px,color:#FFF
- Язык: Java 21
- Фреймворк: Spring Boot 3.5
- База данных: PostgreSQL
- Взаимодействие:
- REST API (для
commerce) - gRPC (для
telemetry) - Apache Kafka (для асинхронных событий в
telemetry)
- REST API (для
- ORM: Spring Data JPA
- Контейнеризация: Docker, Docker Compose
- Качество кода: Lombok
Этот сервис отвечает за регистрацию "умных" устройств и отслеживание их показаний, а также добавление и обработку пользовательских сценариев.
- API: Предоставляет gRPC эндпоинты для регистрации сенсоров, создания сценариев и отправки данных.
- Обработка данных: Входящие данные от сенсоров публикуются в топик Kafka для дальнейшей асинхронной обработки и анализа сценариев. В случае выполнения условий сценария осуществляется обращение к соответствующему устройству по протоколу gRPC.
- Архитектура: Классическая слоистая архитектура (Controller -> Service -> Repository).
Бэкенд для онлайн-магазина, где пользователи могут покупать устройства.
- API: Предоставляет REST API (доступно через API Gateway) для управления пользователями, товарами и заказами.
- Архитектура: Реализована Гексагональная архитектура (Порты и Адаптеры).
- Ядро (Domain): Содержит чистые бизнес-сущности и логику, не зависит ни от каких фреймворков.
- Порты (Application): Определяют интерфейсы взаимодействия с ядром (use cases).
- Входящие адаптеры (Presentation): Реализуют внешние порты — Spring REST-контроллеры.
- Исходящие адаптеры (Infrastructure): Реализуют внутренние порты — репозитории на основе Spring Data JPA.
💡 Почему была выбрана такая архитектура? Такой подход был выбран для максимальной изоляции бизнес-логики от деталей реализации. Это делает код надёжным и легко тестируемым благодаря разделению ответственности и облегчает будущие технологические изменения (например, замену PostgreSQL на NoSQL решение или добавление GraphQL API) без затрагивания ядра бизнес-логики.
Конфигурация Docker Compose присутствует только для модулей telemetry и infra. Конфигурация для модуля commerce на данный момент не реализована.
- Убедитесь, что у вас установлены
DockerиDocker Compose. - Склонируйте репозиторий:
git clone https://github.com/impatient0/plus-smart-home-tech - Перейдите в корневую директорию проекта.
- Выполните команду для сборки и запуска сервисов и баз данных:
docker compose up --build
- gRPC API будет доступно по адресу
grpc://localhost:9090
Локальный запуск требует ручного старта всех сервисов в правильной последовательности.
- Добавьте проект в IntelliJ IDEA (
Menu -> New -> Project from Version Control...). - Выполните
mvn clean installв корневой директории проекта для генерации Q-типов, классов Avro и Protobuf, и т.п. - Запустите конфигурацию
docker-db-Kafkaдля старта инфраструктуры. - Запустите сервисы модуля
infraв следующей последовательности:EurekaServerApp,ConfigServerApplication,GatewayApplication. - Запустите сервисы модуля
telemetry(в любой последовательности):AggregatorApplication,AnalyzerApplication,CollectorApplication. - Запустите сервисы модуля
commerce(в любой последовательности):DeliveryApplication,OrderApplication,PaymentApplication,ShoppingCartApplication,ShoppingStoreApplication,WarehouseApplication. - Сервисы будут доступны по следующим адресам:
- Commerce Service (REST):
http://localhost:8888 - Telemetry Service (gRPC):
grpc://localhost:9090
- Commerce Service (REST):
API каждого сервиса списано в соответствующем файле OpenAPI спецификации в commerce/interaction-api/src/main/resources/specs (обратите внимание, что все спецификации ссылаются на общий common.json).
Для демонстрации работы API рекомендуется использовать Postman для REST-запросов к commerce и, например, grpcurl или BloomRPC для gRPC-запросов к telemetry.
Протестировать API сервиса commerce можно с помощью этой Postman-коллекции.