[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-rest-api-chto-takoe-bff-backend-for-frontend-i-api-gateway":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},1233,"chto-takoe-bff-backend-for-frontend-i-api-gateway",34,"rest-api","REST API","🌐","Что такое BFF (Backend for Frontend) и API Gateway?","BFF (Backend for Frontend) и API Gateway — архитектурные паттерны, определяющие, как клиенты взаимодействуют с backend-сервисами в микросервисной архитектуре.\n\n### API Gateway — единая точка входа\n\nAPI Gateway — прокси-сервер, являющийся единственной точкой входа для всех клиентов. Маршрутизирует запросы и предоставляет сквозную функциональность.\n\n```\n    Web App     Mobile App     Partner API\n       \\            |            \u002F\n        ┌───────────▼───────────┐\n        │      API Gateway      │\n        │ (routing, auth, rate  │\n        │  limiting, logging)   │\n        └────┬────┬────┬────────┘\n             │    │    │\n        ┌────▼┐ ┌─▼──┐ ┌▼────┐\n        │User ││Order││Stock│\n        │Svc  ││ Svc ││ Svc │\n        └─────┘ └────┘ └─────┘\n```\n\nФункции: маршрутизация, аутентификация\u002Fавторизация, Rate Limiting, логирование, трансформация запросов, кэширование, Circuit Breaker.\n\n### BFF — отдельный API для каждого типа клиента\n\nДля каждого типа клиента (web, mobile, admin) создаётся отдельный backend-сервис, оптимизированный под потребности этого клиента.\n\n```\n    Web App         Mobile App        Admin Panel\n       │                │                  │\n  ┌────▼─────┐    ┌─────▼──────┐    ┌─────▼──────┐\n  │ Web BFF  │    │ Mobile BFF │    │ Admin BFF  │\n  │(подробные│    │(компактные │    │(все данные)│\n  │ данные)  │    │ данные)    │    │            │\n  └──┬───┬───┘    └──┬───┬─────┘    └──┬───┬─────┘\n     │   │           │   │             │   │\n     └───┴───────────┴───┴─────────────┴───┘\n              Микросервисы (User, Order, Stock)\n```\n\n### Сравнение подходов\n\n| Характеристика | Прямые вызовы | API Gateway | BFF |\n|---------------|---------------|-------------|-----|\n| Сложность | Минимальная | Средняя | Высокая |\n| Оптимизация под клиента | Нет | Частичная | Полная |\n| Агрегация данных | На клиенте | Ограниченная | Полная |\n| Over-fetching | Да | Да | Нет |\n| Безопасность | На каждом сервисе | Централизованная | На каждом BFF |\n\n\u003Cdetails>\u003Csummary>Примеры реализации\u003C\u002Fsummary>\n\nAPI Gateway на Spring Cloud Gateway:\n```java\n@Configuration\npublic class GatewayConfig {\n\n    @Bean\n    public RouteLocator customRoutes(RouteLocatorBuilder builder) {\n        return builder.routes()\n            .route(\"user-service\", r -> r\n                .path(\"\u002Fapi\u002Fusers\u002F**\")\n                .filters(f -> f\n                    .stripPrefix(1)\n                    .circuitBreaker(cb -> cb\n                        .setName(\"userServiceCB\")\n                        .setFallbackUri(\"forward:\u002Ffallback\u002Fusers\"))\n                    .retry(retry -> retry.setRetries(3)))\n                .uri(\"lb:\u002F\u002Fuser-service\"))\n            .route(\"order-service\", r -> r\n                .path(\"\u002Fapi\u002Forders\u002F**\")\n                .filters(f -> f\n                    .stripPrefix(1)\n                    .requestRateLimiter(rl -> rl\n                        .setRateLimiter(redisRateLimiter())\n                        .setKeyResolver(userKeyResolver())))\n                .uri(\"lb:\u002F\u002Forder-service\"))\n            .build();\n    }\n}\n```\n\nMobile BFF — один вызов для главного экрана:\n```java\n@RestController\n@RequestMapping(\"\u002Fmobile\u002Fapi\")\n@RequiredArgsConstructor\npublic class MobileBffController {\n\n    private final UserServiceClient userClient;\n    private final OrderServiceClient orderClient;\n    private final NotificationServiceClient notificationClient;\n\n    @GetMapping(\"\u002Fhome\")\n    public ResponseEntity\u003CMobileHomeResponse> getHomeScreen(\n            @AuthenticationPrincipal UserPrincipal principal) {\n\n        CompletableFuture\u003CUserSummary> userFuture =\n            CompletableFuture.supplyAsync(() -> userClient.getSummary(principal.getId()));\n        CompletableFuture\u003CList\u003COrderBrief>> ordersFuture =\n            CompletableFuture.supplyAsync(() -> orderClient.getRecent(principal.getId(), 5));\n        CompletableFuture\u003CInteger> notifCountFuture =\n            CompletableFuture.supplyAsync(() -> notificationClient.getUnreadCount(principal.getId()));\n\n        CompletableFuture.allOf(userFuture, ordersFuture, notifCountFuture).join();\n\n        MobileHomeResponse response = new MobileHomeResponse(\n            userFuture.join(), ordersFuture.join(), notifCountFuture.join()\n        );\n        return ResponseEntity.ok(response);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Когда что использовать\n\n- **API Gateway (без BFF):** все клиенты имеют одинаковые потребности, нужна централизованная маршрутизация.\n- **BFF:** клиенты имеют существенно разные потребности, нужна агрегация данных из нескольких сервисов.\n- **API Gateway + BFF:** Gateway для auth\u002Frate limiting\u002Flogging, BFF для агрегации и адаптации данных.\n\n### Частые ошибки\n\n- Реализация бизнес-логики в API Gateway — шлюз должен быть «тонким».\n- Единый BFF для всех клиентов — это просто API Gateway, а не BFF.\n- Синхронные вызовы к микросервисам из BFF — используйте CompletableFuture или virtual threads.\n- Отсутствие Circuit Breaker в BFF.\n\n### Как используется в 2026\n\n- Spring Cloud Gateway — стандарт для API Gateway в экосистеме Spring.\n- GraphQL как альтернатива BFF для гибких запросов.\n- BFF + Virtual Threads (Java 21+) — упрощают параллельные вызовы.\n- API Gateway as a Service — Kong, AWS API Gateway, Azure APIM.\n\n> **На собеседовании:** нужно чётко разграничить API Gateway (сквозная функциональность: auth, routing, rate limiting) и BFF (агрегация и адаптация данных под конкретный клиент). Частая ошибка — путать их или считать, что BFF заменяет API Gateway. Они дополняют друг друга.","","senior",[15],"rest",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":20,"featuredSnippetReady":23},"Что такое BFF (Backend for Frontend) и API Gateway? — Gymterview","BFF (Backend for Frontend) и API Gateway — архитектурные паттерны, определяющие, как клиенты взаимодействуют с backend-сервисами в микросервисной архитектуре.","BFF (Backend for Frontend) и API Gateway — архитектурные паттерны, определяющие, как клиенты взаимодействуют с backend-с",[15,13],true]