System Overview
Общая схема
graph TB subgraph CLIENTS["КЛИЕНТЫ"] WEB["Web-сайт<br/>(Next.js)"] APP["Мобильное приложение<br/>(React Native)"] BO["Бэк-офис<br/>(React SPA)"] POS["Кассовая программа<br/>(Electron / Android)"] end subgraph GW["API GATEWAY — Kong / Nginx :8000"] GATEWAY["Маршрутизация · Rate Limiting<br/>JWT-валидация · CORS · Логирование"] end WEB --> GATEWAY APP --> GATEWAY BO --> GATEWAY POS --> GATEWAY subgraph BFF["BFF — Backend for Frontend (Node.js)"] ADMIN_BFF["Admin BFF<br/>Fastify :3020"] CUSTOMER_BFF["Customer BFF<br/>Fastify :3021"] POS_BFF["POS BFF<br/>Fastify :3022"] end GATEWAY --> ADMIN_BFF GATEWAY --> CUSTOMER_BFF GATEWAY --> POS_BFF subgraph CORE["CORE SERVICES"] AUTH["Auth Service<br/>Spring Boot :3001"] USER["User Service<br/>Spring Boot :3002"] STORE["Store Service<br/>Spring Boot :3003"] CATALOG["Catalog Service<br/>Spring Boot :3004"] end subgraph DOMAIN["DOMAIN SERVICES"] WAREHOUSE["Warehouse Service<br/>Spring Boot :3008"] end ADMIN_BFF --> AUTH ADMIN_BFF --> USER ADMIN_BFF --> STORE ADMIN_BFF --> CATALOG ADMIN_BFF --> WAREHOUSE CUSTOMER_BFF --> AUTH CUSTOMER_BFF --> CATALOG CUSTOMER_BFF --> STORE POS_BFF --> AUTH POS_BFF --> CATALOG subgraph MQ["MESSAGE BROKER"] KAFKA["Apache Kafka<br/>:9092"] end subgraph INFRA["ИНФРАСТРУКТУРА"] PG["PostgreSQL<br/>:5432"] REDIS["Redis<br/>:6379"] S3["S3 / MinIO<br/>:9000"] end AUTH --> REDIS AUTH --> PG USER --> PG STORE --> PG STORE --> REDIS CATALOG --> PG CATALOG --> REDIS CATALOG --> S3 STORE --> S3 WAREHOUSE --> PG style CLIENTS fill:#1a1a2e,stroke:#e94560,color:#fff style GW fill:#e94560,stroke:#e94560,color:#fff style BFF fill:#2d6a4f,stroke:#40916c,color:#fff style CORE fill:#0f3460,stroke:#e94560,color:#fff style DOMAIN fill:#16213e,stroke:#533483,color:#fff style MQ fill:#533483,stroke:#533483,color:#fff style INFRA fill:#1a1a2e,stroke:#0f3460,color:#fff
Принципы архитектуры
- Database per Service — каждый сервис имеет свою БД PostgreSQL
- Event-Driven — асинхронное взаимодействие через Apache Kafka
- API Gateway — единая точка входа с JWT-валидацией
- BFF (Backend for Frontend) — каждый клиент имеет свой BFF-сервис, агрегирующий данные из микросервисов
- Мультитенантность — данные изолированы по ЮЛ/ТТ через franchise_id
BFF-слой (Backend for Frontend)
Клиенты не обращаются к микросервисам напрямую. Между API Gateway и Core/Domain Services находится BFF-слой — тонкие Node.js-сервисы (Fastify + TypeScript), которые:
- Агрегируют данные из нескольких микросервисов в один ответ (
Promise.all) - Отдают фронту ровно то, что нужно конкретной странице
- Скрывают внутреннюю топологию сервисов
- Централизуют ролевую фильтрацию данных
Каждый BFF живёт в одной репе со своим фронтом (monorepo: bff/ + web/ + shared/), что позволяет шарить TypeScript-типы между фронтом и BFF.
| BFF | Порт | Клиент | Репозиторий | Фаза |
|---|---|---|---|---|
| Admin BFF | :3020 | Бэк-офис (React SPA) | admin/ | MVP Phase 1 |
| Customer BFF | :3021 | Web-сайт (Next.js) + Мобильное приложение | customer/ | Phase 2 |
| POS BFF | :3022 | POS-касса (Electron / Android) | pos/ | Phase 2 |
BFF — не бизнес-логика
BFF не содержит бизнес-логику. Только агрегация, маппинг и проксирование запросов. Вся доменная логика остаётся в Java-микросервисах.
Будущие сервисы (не в текущем скоупе)
| Сервис | Порт | Назначение |
|---|---|---|
| Order Service | :3005 | Заказы, статусы, курьеры |
| Payment Service | :3006 | Оплата, эквайринг |
| Loyalty Service | :3007 | Бонусы, купоны, скидки |
| Finance Service | :3009 | ДДС, баланс, счета |
| Notification Service | :3010 | Push, email, SMS |
| Report Service | :3011 | Аналитика, экспорт |
| Integration Service | :3012 | Агрегаторы доставки |