Шлюз SALT.BOX
Шлюз SALT.BOX (SALT.BOX Gateway) — это компонент платформы SALT.BOX, реализующий API Gateway для микросервисной архитектуры.
Он обеспечивает маршрутизацию запросов, балансировку нагрузки, проверку работоспособности сервисов, кэширование, а также централизованное управление доступом на основе политик OPA (Open Policy Agent) и системы разрешений приложений («пермишенов»).
Шлюз SALT.BOX работает поверх фреймворка FastAPI, интегрируется с Redis для хранения состояния и кэша, а также с OPA для проверки разрешений.
Пермишен (от англ. permission — разрешение, дозволение) — механизм безопасности, предназначенный для защиты конфиденциальности пользователей.
Он ограничивает доступ приложений к различным функциям и данным на устройстве.
Архитектура
Компоненты шлюза SALT.BOX:
- ServiceDAO — слой доступа к данным о сервисах (Redis)
- ProxyService — основной класс для проксирования запросов, балансировки, проверки доступа
- BalancingStrategy — фабрика стратегий балансировки
- AsyncOpaClient — клиент для проверки политик OPA
- CustomRedisCache — кэширование ответов
Основные возможности
- Динамическое обнаружение и управление сервисами (Service Discovery)
- Балансировка нагрузки (Round Robin, Weighted RR, Random)
- Проверка работоспособности экземпляров сервисов
- Кэширование ответов
- Проксирование статических файлов
- Управление доступом через OPA и пермишены
- API для управления сервисами и экземплярами сервисов
- Swagger/OpenAPI документация для сервисов
Динамическое обнаружение и управление сервисами
Функции управления сервисами, реализуемые шлюзом SALT.BOX:
- Регистрация/отключение/удаление сервисов и их экземпляров через API
- Автоматическое обновление состояния сервисов
- Поддержка нескольких экземпляров одного сервиса
Регистрация сервиса в Discovery
Для регистрации нового сервиса (например, Ядро) используется механизм Service Discovery.
Сервис при запуске отправляет информацию о себе (имя, точки подключения («эндпоинты»), тип, стратегия балансировки, разработчик и пр.) шлюзу SALT.BOX через API или напрямую в Redis.
Эндпоинт (от англ. endpoint — точка подключения) — конкретный сетевой адрес, URL, который определяет точку доступа к ресурсу или услуге на сервере.
Клиентское приложение обращается к конечной точке для выполнения определённых операций или получения данных.
Регистрация сервиса выполняется по следующему алгоритму:
- Если сервис с таким именем ещё не зарегистрирован, добавляется один экземпляр сервиса
- Если сервис уже существует, то добавляется новый экземпляр этого сервиса, при совпадении
idсервиса обновляется текущий экземпляр - В SDK реализован клиент, который отправляет POST-запрос на
/api/discovery/registerс описанием сервиса и его экземпляра - При регистрации сервис передаёт шлюзу полный список своих эндпоинтов с их настройками: политикой доступа (OPA policy), параметрами кэширования (
cache_ttl), partial-query, action и др. - После регистрации сервис появляется в списке доступных сервисов шлюза и становится доступен для проксирования
- На основе зарегистрированных эндпоинтов шлюз осуществляет проверку доступа (через OPA) и кэширование ответов согласно настройкам эндпоинта
Балансировка нагрузки
Шлюз SALT.BOX поддерживает следующие стратегии балансировки нагрузки:
rr— Round Robin (Циклический перебор)wrr— Weighted Round Robin (Взвешенный циклический перебор)rand— Random (Случайная)
Стратегия задаётся для каждого сервиса, её можно менять через API.
Кэширование
- Кэшируется только успешные ответы (
200 OK), если эндпоинт поддерживает TTL - Кэш хранится в Redis,
namespace:gate_cache - Кэш отключается для Swagger/OpenAPI и приватных эндпоинтов
Проксирование статических файлов
Для сервисов с настроенным static_host запросы к статическим файлам проксируются напрямую.
Авторизация и управление доступом
Шлюз SALT.BOX реализует централизованную систему управления доступом на основе OPA (Open Policy Agent) и пермишенов, поддерживающую модель ABAC (Attribute-Based Access Control).
Преимущества решения
- ABAC: доступ определяется на основе атрибутов пользователя, ресурса, действия и сервиса
- Гибкость: политики сгруппированы по сервисам, например: core (Ядро), scheduler (Планировщик), ресурсам, например: задачи (tasks), команды (jobs), коллекции (collections) и действиям, например: read (чтение), create (создание)
- Масштабируемость: легко добавлять новые сервисы, ресурсы, роли и условия
- Partial Query: OPA может возвращать фильтр для ограничения данных на уровне запроса