Да, у меня есть опыт создания слоя BFF внутри монолитного API. Вместо того, чтобы выделять его в отдельный сервис, мы использовали внутренний модуль, который называли "Frontend Service" или "Frontend Adapter".
Этот модуль был ответственен за агрегацию данных из различных микросервисов и формирование DTO для фронтенда. Он также обрабатывал различные запросы фронтенда, выполнял расчеты и предоставлял дополнительную функциональность, которая была необходима только для фронтенда.
Было несколько подходов, которые мы применяли, чтобы облегчить разработку и поддержку этого BFF-слоя:
1. Микросервисы предоставляли API, которые были оптимизированы для своих специфических нужд и не обрабатывали запросы фронтенда напрямую. Вместо этого, Frontend Service использовал их API для получения данных и агрегировал их, чтобы сформировать DTO для фронтенда.
2. Мы использовали кэширование для ускорения ответов на запросы фронтенда. Frontend Service кэшировал результаты запросов и обновлял кэш по требованию или по расписанию. Это позволяло снизить нагрузку на микросервисы и увеличить производительность.
3. Мы создали библиотеку утилит для работы с данными, которую использовал Frontend Service. Это включало в себя функции для манипулирования и агрегирования данных, а также вспомогательные функции для работы с DTO. Это сделало разработку и поддержку Frontend Service более эффективными и улучшило общую производительность.
Ситуация, когда фронтенд запрашивает множество различных данных, была решена с помощью оптимизации процесса формирования DTO. Мы использовали кэширование и агрегацию данных, чтобы снизить количество запросов к микросервисам и уменьшить время обработки запросов. Мы также разбили формирование DTO на несколько этапов и оптимизировали каждый этап, чтобы ускорить процесс.
В итоге, создание слоя BFF внутри монолитного API позволило нам обогатить данные, отдаваемые на фронтенд, и предоставить фронтенду дополнительную возможность работы с данными. Это также упростило разработку и поддержку фронтенд-части приложения.