High Performance API Gateway или путь к собственному шлюзу
Фабула:
В микросервисной архитектуре API Gateway решает проблему «разрастания эндпоинтов» — вместо того чтобы клиенты знали о десятках внутренних сервисов, они работают с единым API. Это упрощает клиентский код, позволяет независимо развивать backend и централизованно управлять политиками безопасности.
10 лет — срок, за который успеваешь пройти путь от восторженного первооткрывателя до усталого прагматика, а затем, если повезёт, вернуться к чему-то вроде осознанного энтузиазма. Именно столько я живу бок о бок с микросервисной архитектурой, и почти всё это время меня преследует один и тот же вопрос: почему ни один API Gateway не делает всё так, как хотелось бы?
Всё начиналось с Ocelot — .NET-овского решения, которое в своё время казалось откровением. Отличный конструктор с декларативная конфигурацией и понятной маршрутизацией. Но стоило выйти за рамки типовых сценариев — и приходилось лезть в код, дописывать middleware, мириться с ограничениями или искать обходные пути. Потом был KrakenD — быстрый, написанный на Go, с красивой идеей агрегации бэкендов. Lura, лежащая в его основе, обещала расширяемость, но на практике каждая дополительная нетривиальная задача значительно увеличивала время ответа и даже реализация gRPC Unary требовала "костыля".
Отдельная боль, которую я испытывал годами — управление секретами и сертификатами. Пароли в конфигах. API-ключи в environment variables. Сертификаты, которые забывают обновить и сервис падает в три часа ночи. Ротация credentials, которая требует рестарта.
Я модифицировал, патчил, оборачивал в прокси-слои, писал плагины. Решал частные задачи — и каждый раз ловил себя на мысли: «Вот бы это уже было из коробки».
Годы шли, проекты менялись, технологии эволюционировали — а мечта оставалась. Создать свой opensource API Gateway. Не очередной «ещё один прокси», а инструмент, спроектированный с учётом всего того опыта, который накопился за эти годы. Инструмент, где каждая функция — это ответ на реальную боль, а не галочка в маркетинговом чеклисте.
И вот, наконец, появилось время, накопленные знания и технологии чтобы реализовать. Так родился AV API Gateway.
Что умеет AV API Gateway
Маршрутизация и протоколы. Полноценная поддержка HTTP и нативный gRPC через отдельный порт с HTTP/2. Маршрутизация по exact, prefix, regex и wildcard паттернам. Matching по методам, заголовкам, query-параметрам. Для gRPC — роутинг по сервису и методу, metadata matching, поддержка всех типов стриминга: unary, server streaming, client streaming, bidirectional.
Аутентификация. JWT с поддержкой RS256, ES256, HS256, Ed25519 и автоматическим обновлением ключей через JWKS URL. API Key с хешированием и per-key rate limiting. mTLS с извлечением identity из сертификата. Полноценная OIDC-интеграция с Keycloak, Auth0, Okta, Azure AD — с discovery и кешированием токенов.
Авторизация. RBAC на основе JWT claims с иерархией ролей. ABAC с CEL-выражениями для сложных политик. Интеграция с Open Policy Agent для внешней авторизации. Кеширование решений с настраиваемым TTL.
Управление трафиком. Load balancing с алгоритмами round-robin, weighted, least connections. Health checking бэкендов с настраиваемыми порогами. Token bucket rate limiting на уровне глобальном, роута и бэкенда. Max sessions с очередями и таймаутами. Circuit breaker с автоматическим восстановлением. Retry policies с exponential backoff. Traffic mirroring для тестирования. Fault injection для chaos engineering.
Трансформация данных. Фильтрация полей ответа через allow/deny списки. Маппинг и переименование полей. Группировка в nested-объекты и flattening. Операции над массивами: append, prepend, filter, sort, limit, deduplicate. Go-шаблоны для кастомного форматирования. Merge responses от нескольких бэкендов. Для gRPC — FieldMask filtering, трансформация metadata, rate limiting на streaming-сообщениях.
Кеширование. In-memory кеш с TTL и лимитом записей. Redis для распределённого кеширования. Stale-while-revalidate. Negative caching для ошибок. Гибкая генерация ключей кеша.
Observability. Prometheus metrics по всем аспектам: запросы, latency, размеры, состояние circuit breakers, rate limit hits, аутентификация, авторизация. OpenTelemetry tracing с настраиваемым sampling. Structured logging в JSON или console формате.
HashiCorp Vault
Хранение секретов и автоматический выпуск и перевыпуск сертификатов.
Операционная готовность. Hot configuration reload без рестарта. Graceful shutdown с connection draining. Docker-образы. Helm chart для Kubernetes с поддержкой HPA, PDB, Ingress. Multi-platform builds.
AV API Gateway — это не просто технический проект. Это кристаллизация десяти лет опыта, десятков решённых задач и workaround'ов, которые больше не нужны. Это инструмент, который я хотел бы иметь, когда начинал работать с микросервисами. И теперь он есть — открытый и расширяемый.
Присоединяйтесь к разработке и тестированию, пишите issues и пожелания!!!
Исходный код доступен на GitHub
P.S.: это первый релиз в ближайшее время появится k8s operator для и конфигурации уровня route и backend через CRD. AV API Gateway можно будет использовать как Ingress Gateway