Представьте, что нам нужно показать карточку товара в интернет-магазине. За описанием товара надо сходить в один микросервис, за актуальной ценой и скидками — в другой, а за наличием — в третий. Фронтенд может сам дернуть несколько микросервисов с бэка, но есть и другой подход.
Backend-for-frontend — это слой между фронтендом и микросервисами, который служит специализированным бэкендом для конкретного типа клиента (веб, мобилки и др.)
По сути BFF — это отдельный компонент на бэке (при микросервисной архитектуре в виде микросервиса), который:
1️⃣получает запрос типа GET /product/123
2️⃣сам делает запросы в нужные микросервисы
➡️ GET /descriptions/123
➡️ GET /prices/123
➡️ GET /inventory/123
3️⃣Собирает ответы, формирует из них общий ответ для клиента и отправляет его
Плюсы по сравнению с отдельными запросами с фронта:
➕ фронт меньше завязан на внутреннее устройство бэка, меньше логики на фронте
➕ Позволяет делать меньше запросов и получать только нужные данные
➕ BFF управляет версиями, кэшированием, сценариями работы при ошибках
BFF могут писать как фронтенд-разработчики на Node.js, так и бэкендеры на своем языке. Например, я работала с BFF, написанном на Java.
При такой схеме
🔜 запрос сначала поступает на API Gateway (пост про него),
🔜 оттуда маршрутизируется в BFF,
➡️ а из BFF уже идут запросы к микросервисам с логикой.
Для API у BFF обычно используют REST, а от BFF к другим микросервисам может быть как REST, так и gRPC (пост про gRPC vs REST).
Часто под фронт и мобилки делают отдельные BFF, адаптированные под их потребности. Если есть отдельный публичный API, на который ходят корпоративные клиенты, где тоже требуется агрегация ответов от разных микросервисов, то тоже делают отдельный промежуточный сервис, аналогичный BFF.
Важно! Такой подход нужен не всегда. Если не требуется кастомизации под разных клиентов (веб, мобилки и др.) и не требуется агрегация ответов из нескольких микросервисов, то можно обойтись без BFF.
На сисдиз-собесе, как мне кажется, BFF обычно не рисуют, но знать о нем определенно стоит.
Однажды на архитектурной секции мне задали как раз такой вопрос про карточку товара. А я тогда еще не знала про BFF. Но отвечать-то надо.
Вспомнила, что когда-то давно была фулстеком, напрягла память посильнее и выдала код на JavaScript с Promise.all() и параллельными fetch-запросами. Спустя пару лет чистого бэка сама от себя не ожидала. Вот что собесы животворящие делают 😂
Архитектор, задававший вопрос, конечно, удивился: не каждый день на арх собесе пишут код на JS 😂
Рассказал мне тогда про BFF. В тот же вечер я почитала про него подробнее. Собес в итоге прошла, и стала работать на проекте с BFF.
А вы встречались в работе с BFF?
#сисдиз
