⚠️ Статус: Прототип / Инфраструктурный PoC. Разработка приостановлена.
Этот репозиторий представляет собой технический прототип, ориентированный на настройку микросервисов, Docker и базовую наблюдаемость. Механизм передачи данных и уровни трассировки реализованы не полностью.
Распределенная система для управления разнородными источниками данных.
- Микросервисная архитектура: Масштабируемые и независимые компоненты.
- Поддержка Docker: Полная контейнеризация сервисов и баз данных.
- Слой абстракции: Взаимодействие с различными БД (SQLite, PostgreSQL, MS SQL) через единый API.
- Автоматические миграции: Накатывание схем и наполнение данными (seeding) при запуске для быстрой разработки.
- WPF Client: Отправляет HTTPS-запросы к API Gateway.
- API Gateway: Выполняет маршрутизацию и вызывает нужные микросервисы через gRPC.
- Security Service: Отвечает за авторизацию пользователей в приложении.
- Metadata Service: Предоставляет параметры подключения к целевым базам данных.
- Query Execution Service: Выполняет SQL-запросы в выбранной базе (внутренней или внешней).
Приложение поддерживает два метода идентификации целевой БД:
- Явная строка подключения: Быстрое подключение без предварительной настройки.
- Источники данных (Data Sources): Именованные профили (например,
[DataSource Name="Analytics"]) для повышения безопасности и удобства.
Бесшовный перенос данных между различными движками баз данных.
Система автоматически инициализирует несколько баз данных PostgreSQL при запуске. Вам не нужно создавать их вручную.
Используются микросервисами для хранения системных метаданных и логики безопасности:
sqlviewer-security: Хранит пользователей, роли и разрешения для сервиса Security (connection string:[DataSource Name="pg-security-db"]).sqlviewer-metadata: Хранит конфигурации источников данных и абстракции подключений (connection string:[DataSource Name="pg-metadata-db"]).sqlviewer-query: Хранит историю запросов и логи выполнения (connection string:[DataSource Name="pg-query-db"]).sqlviewer-etl: Хранит ETL команды и сообщения (connection string:[DataSource Name="pg-etl-db"]).
Для целей тестирования предоставляется база sqlviewer-sandbox.
- Она заранее заполнена примерами таблиц (например,
Employees,Orders). - Её можно использовать сразу после запуска для проверки SQL-запросов или ETL-процессов.
- Имя источника данных по умолчанию:
[DataSource Name="pg-sandbox-db"]
Примечание: Все миграции и тестовые данные применяются автоматически через Entity Framework Core при запуске сервисов.
# For Windows (PowerShell)
dotnet dev-certs https -ep $env:USERPROFILE\.aspnet\https\aspnetapp.pfx -p YourSecurePassword123
dotnet dev-certs https --trust
# For Linux/macOS
dotnet dev-certs https -ep ${HOME}/.aspnet/https/aspnetapp.pfx -p YourSecurePassword123
dotnet dev-certs https --trustСоздайте файл .env в корневой директории проекта:
# Database server
DB_PASSWORD=postgres
# Encryption
ENCRYPTION_KEY=YourSuperSecretKey123
# HTTP certificate
# For Windows
HOST_CERT_PATH=${USERPROFILE}\.aspnet\https
# For Linux/macOS it could be: HOST_CERT_PATH=~/.aspnet/https
CERT_PASSWORD=1234
# JWT
JWT_KEY=TMbQYRKQfN5kG+LfcDocF6ezcs8HL/EK4pBZ5V9UZwo=
JWT_LIFETIME_MINUTES=90
JWT_ISSUER=sqlviewer/security
JWT_AUDIENCE=sqlviewer/api-gateway
JWT_ISSUER_KEY=iZSSPdC53bxc301eVH/bN6eTjzmXkMIhvMbxfcn0q8k=Выполните команду: docker compose up --build
Система мониторинга разворачивается автоматически вместе с основными сервисами.
Запустите инфраструктуру: docker-compose up -d
Служит для сбора и хранения метрик производительности ваших сервисов.
- Адрес: http://localhost:9090
- Проверка: Перейдите в меню
Status->Targets. - Ожидаемый результат: Все сервисы (
api-gateway,security,metadataи др.) должны иметь статус UP. Это значит, что Prometheus успешно забирает данные с эндпоинтов:8080/metrics.
🔐 Заметка по безопасности (Production-ready):
В рамках данного pet-проекта порты метрик (например,:5103,:8080) проброшены вdocker-compose.ymlнаружу для удобства ручной проверки эндпоинтов/metricsиз браузера. В реальном production-окружении эти порты должны быть закрыты для внешнего доступа и доступны только внутри виртуальной сети Docker для самого Prometheus.
Позволяет визуализировать путь запроса через все микросервисы (от API Gateway до БД).
- Адрес: http://localhost:16686
- Проверка:
- Сделайте любой запрос к API (через WPF-клиент или Swagger).
- В Jaeger в поле Service выберите
api-gateway. - Нажмите Find Traces. Вы увидите временную шкалу (Span) вашего запроса и его прохождение через gRPC-вызовы.
Красивые дашборды для мониторинга состояния системы в реальном времени.
- Адрес: http://localhost:3000
- Доступ:
admin/admin - Первичная настройка:
- Перейдите в
Connections->Data Sources->Add data source. - Выберите Prometheus.
- В поле URL введите
http://prometheus:9090и нажмите Save & Test.
- Перейдите в
Для глубокого анализа ASP.NET Core сервисов рекомендуется использовать готовый дашборд.
- В Grafana нажмите Dashboards -> New -> Import.
- В поле
"Import via grafana.com"введите ID:19924и нажмите Load. - В выпадающем списке выберите созданный ранее DataSource (Prometheus).
- Нажмите Import.
Что доступно на дашборде:
- Requests per second: интенсивность входящего трафика.
- Request Duration: задержки (latency) ответов API.
- HTTP Error Rate: процент ошибок (
4xx/5xx). - Resource Usage: потребление CPU и RAM каждым микросервисом.
В этом разделе описаны технические проблемы и архитектурные аспекты, выявленные на текущем этапе разработки. Эти моменты планируется включить в будущие итерации для повышения отказоустойчивости и масштабируемости системы.
В настоящее время несколько настольных клиентов могут синхронизировать свои запросы на опрос состояния, что потенциально может привести к значительным скачкам нагрузки на API Gateway и ETL Service («эффект грохочущего стада»).
-
Предлагаемое решение: Реализовать дрожание (добавление небольшой случайной задержки к каждому запросу) для более равномерного распределения нагрузки во времени.
-
Обработка ошибок: Реализовать экспоненциальную задержку для увеличения задержки между повторными попытками, если сервер возвращает ошибки 5xx или ответы с ограничением скорости (429).
Текущий фоновый процесс для активных операций поддерживает постоянный интервал опроса независимо от состояния приложения.
- Предлагаемое решение: Реализовать адаптивную стратегию опроса. Интервал должен увеличиваться (например, с 2 до 30 секунд), если окно приложения свернуто, что позволит уменьшить ненужный сетевой трафик и использование ЦП как на стороне клиента, так и на стороне сервера.
Из-за пакетной обработки в ETL Worker и Data Transfer Worker контекст трассировки CorrelationId может иногда нарушаться при группировке сообщений.
- Предлагаемое решение: Вручную распространять
SpanContext, извлекая заголовки трассировки из отдельных сообщений в пакете и создавая дочерние сегменты для каждой задачи обработки.
