Современные веб-приложения часто состоят из сложного бэкенда, представляющего собой совокупность различных микросервисов или монолитную программу. Это создаёт проблему для фронтенда, которому приходится взаимодействовать с каждым микросервисом отдельно, что неудобно и приводит к жёсткой связи между фронтендом и бэкендом. Решение этой проблемы лежит в использовании паттернов проектирования, таких как API Gateway и Backend-for-Frontend (BFF).
API Gateway: единое окно для доступа к API
API Gateway — это прокси-сервер, предоставляющий единый интерфейс (API) для доступа к различным бэкенд-сервисам. Он выступает в качестве единого окна, скрывая от фронтенда сложность внутренней архитектуры бэкенда. Gateway пересылает запросы от клиента к необходимому микросервису и обратно, обрабатывая различия в контрактах (правилах взаимодействия). Это снижает связанность между фронтендом и бэкендом, позволяя изменять внешний вид приложения, бизнес-логику или клиентское приложение без влияния на другие API. Gateway также может кэшировать запросы и реализовывать простую бизнес-логику для контроля над данными.
Backend-for-Frontend (BFF): развитие идеи единого окна
Backend-for-Frontend (BFF) — это развитие идеи API Gateway, фокусирующееся на обеспечении единого контракта и контроля над набором данных для каждого фронтенда. BFF обязательно включает в себя API Gateway и предъявляет к нему дополнительные требования:
- Общие шаблоны на клиенте и сервере: например, использование GraphQL.
- Высокая скорость ответа под нагрузкой.
- Единый язык на клиенте и промежуточном сервере.
Использование общих шаблонов ускоряет разработку и упрощает поддержку как клиентской, так и серверной части приложения. Единый язык позволяет переиспользовать код, а высокая скорость достигается за счёт кэширования и предварительной подготовки данных. BFF может использоваться не только для доступа к различным API, но и в архитектурах с микросервисами на стороне сервера.
Реализация BFF на JavaScript
Для построения архитектуры с BFF на JavaScript рекомендуется использовать Node.js (хотя существуют альтернативы, такие как Deno или Bun). Node.js хорошо подходит для большого количества операций ввода-вывода. Выбор архитектуры — важный этап. Для BFF подходят несколько подходов:
- Трехуровневая архитектура: Исторически первый подход, состоящий из слоёв клиента, бизнес-логики и данных. Проблема этого подхода в жёсткой привязке к данным, что затрудняет развитие и поддержку.
- Domain-Driven Design (DDD): Более современный подход с четырьмя слоями: пользовательский интерфейс, бизнес-логика, домен и инфраструктура. Хотя и неплох, он может быть слишком сложен для BFF.
- Чистая архитектура: Использует те же четыре слоя, что и DDD, но слой инфраструктуры поднимается до уровня пользовательского интерфейса, избегая «протечки абстракции». Домен становится центром приложения. В современных BFF-приложениях часто используется именно этот подход, например, с фреймворком Express.js и GraphQL.
Выбор конкретной реализации зависит от бизнес-задачи и доменной области веб-приложения.
API Gateway и Backend-for-Frontend — это мощные паттерны проектирования, позволяющие упростить взаимодействие фронтенда со сложным бэкендом, улучшить масштабируемость и поддерживаемость приложения. Выбор подходящего подхода зависит от специфики проекта, но чистая архитектура с использованием Node.js и GraphQL часто является эффективным решением для BFF.