Ответ
Проект был построен на основе микросервисной архитектуры с четким разделением ответственности.
Стек технологий и компоненты:
| Компонент | Технологии | Назначение |
|---|---|---|
| Frontend | React.js (SPA), TypeScript | Пользовательский интерфейс, общение через REST API. |
| API Gateway | NGINX / Kong | Маршрутизация, SSL-терминация, аутентификация. |
| Бизнес-сервисы | Node.js (Express), Python (Flask) | Основная логика (Auth Service, Order Service, Analytics Service). |
| Базы данных | PostgreSQL (транзакции), MongoDB (документы/аналитика) | Каждый сервис использовал свою схему или БД. |
| Асинхронная коммуникация | RabbitMQ | Обработка фоновых задач (отправка email, генерация отчетов). |
| Оркестрация | Kubernetes (K8s) на AWS (EKS) | Развертывание, масштабирование и управление контейнерами. |
| CI/CD | GitLab CI/CD | Автоматическая сборка Docker-образов, прогон тестов и деплой в K8s. |
| Мониторинг | Prometheus, Grafana, ELK Stack | Сбор метрик, логов и визуализация. |
Пример интеграционного теста для API заказа:
import requests
def test_order_creation():
# 1. Аутентификация
auth_response = requests.post(
"https://api.company.com/auth/login",
json={"username": "test", "password": "secret"}
)
token = auth_response.json()["access_token"]
# 2. Создание заказа
order_response = requests.post(
"https://api.company.com/orders",
json={"product_id": 456, "quantity": 1},
headers={"Authorization": f"Bearer {token}"}
)
# 3. Проверки
assert order_response.status_code == 201
order_data = order_response.json()
assert "id" in order_data
assert order_data["status"] == "PENDING"
# 4. Проверка согласованности (запрос в сервис заказов)
get_response = requests.get(
f"https://api.company.com/orders/{order_data['id']}",
headers={"Authorization": f"Bearer {token}"}
)
assert get_response.status_code == 200
Ключевые принципы: независимое развертывание сервисов, контейнеризация, строгое API-версионирование, автоматизированное тестирование на всех уровнях.