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:3021Web-сайт (Next.js) + Мобильное приложениеcustomer/Phase 2
POS BFF:3022POS-касса (Electron / Android)pos/Phase 2

BFF — не бизнес-логика

BFF не содержит бизнес-логику. Только агрегация, маппинг и проксирование запросов. Вся доменная логика остаётся в Java-микросервисах.

Будущие сервисы (не в текущем скоупе)

СервисПортНазначение
Order Service:3005Заказы, статусы, курьеры
Payment Service:3006Оплата, эквайринг
Loyalty Service:3007Бонусы, купоны, скидки
Finance Service:3009ДДС, баланс, счета
Notification Service:3010Push, email, SMS
Report Service:3011Аналитика, экспорт
Integration Service:3012Агрегаторы доставки

Ссылки