[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-chto-takoe-spring-webflux-i-chem-on-otlichaetsya-ot-spring-mvc":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":15,"progress":16,"seo":17},998,"chto-takoe-spring-webflux-i-chem-on-otlichaetsya-ot-spring-mvc",31,"reactive","Reactive","⚡","Что такое Spring WebFlux и чем он отличается от Spring MVC?","Spring WebFlux — реактивный веб-фреймворк в Spring, работающий на неблокирующем сервере (Netty по умолчанию). Является альтернативой Spring MVC для построения асинхронных, неблокирующих веб-приложений.\n\n### Архитектурные различия\n\n| Критерий | Spring MVC | Spring WebFlux |\n|----------|-----------|----------------|\n| Модель выполнения | Один поток на запрос (thread-per-request) | Event loop (цикл событий) |\n| Сервер | Tomcat, Jetty (Servlet API) | Netty, Undertow (неблокирующий) |\n| Типы возврата | Object, ResponseEntity | Mono, Flux |\n| Блокирующие вызовы | Допустимы | Запрещены в event-loop потоках |\n| Потоковая передача | Ограничена | Нативная (SSE, WebSocket) |\n| Потребление памяти | ~1 MB stack на поток | Минимальное (несколько event-loop потоков) |\n| Макс. concurrent запросов | 200-500 (пул потоков) | Десятки тысяч соединений |\n\n### Аннотированные контроллеры (общий стиль для MVC и WebFlux)\n\n```java\n@RestController\n@RequestMapping(\"\u002Fapi\u002Fusers\")\npublic class UserController {\n\n    @GetMapping(\"\u002F{id}\")\n    public Mono\u003CResponseEntity\u003CUser>> getUser(@PathVariable Long id) {\n        return userService.findById(id)\n            .map(ResponseEntity::ok)\n            .defaultIfEmpty(ResponseEntity.notFound().build());\n    }\n\n    @GetMapping\n    public Flux\u003CUser> getAllUsers() {\n        return userService.findAll();\n    }\n}\n```\n\n\u003Cdetails>\u003Csummary>Функциональный стиль (Router Functions) — только WebFlux\u003C\u002Fsummary>\n\n```java\n@Configuration\npublic class RouterConfig {\n\n    @Bean\n    public RouterFunction\u003CServerResponse> routes(UserHandler handler) {\n        return RouterFunctions.route()\n            .GET(\"\u002Fapi\u002Fusers\u002F{id}\", handler::getUser)\n            .GET(\"\u002Fapi\u002Fusers\", handler::getAllUsers)\n            .POST(\"\u002Fapi\u002Fusers\", handler::createUser)\n            .build();\n    }\n}\n\n@Component\npublic class UserHandler {\n\n    private final UserService userService;\n\n    public Mono\u003CServerResponse> getUser(ServerRequest request) {\n        Long id = Long.parseLong(request.pathVariable(\"id\"));\n        return userService.findById(id)\n            .flatMap(user -> ServerResponse.ok().bodyValue(user))\n            .switchIfEmpty(ServerResponse.notFound().build());\n    }\n\n    public Mono\u003CServerResponse> getAllUsers(ServerRequest request) {\n        return ServerResponse.ok().body(userService.findAll(), User.class);\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### Когда выбирать WebFlux\n\n- Высокая конкурентность (тысячи одновременных соединений)\n- Streaming-сценарии (SSE, WebSocket, реактивные потоки)\n- Полностью неблокирующий стек (R2DBC, WebClient, reactive Redis\u002FMongo)\n- Микросервисы с интенсивным межсервисным взаимодействием\n\n### Когда оставаться на Spring MVC\n\n- Блокирующие зависимости (JDBC, JPA\u002FHibernate)\n- Простая CRUD-логика без требований к высокой конкурентности\n- Команда не знакома с реактивным программированием\n- Уже работающее приложение на MVC\n\n### Частые ошибки\n\n- Использование JDBC\u002FJPA в WebFlux — блокирующие вызовы заблокируют event-loop; нужен R2DBC или `Schedulers.boundedElastic()`\n- Выбор WebFlux «потому что это новее» — если нет требований к конкурентности, MVC проще\n- Смешивание блокирующего и реактивного кода без `subscribeOn` — незаметно блокирует event-loop\n- Отладка реактивных цепочек — нужен `Hooks.onOperatorDebug()` или `checkpoint()`\n\n### Как используется в 2026\n\n- С Virtual Threads (Java 21) Spring MVC покрывает большинство сценариев, ранее требовавших WebFlux\n- Spring Boot 3.2+: `spring.threads.virtual.enabled=true` для MVC на виртуальных потоках — проще, чем WebFlux\n- WebFlux остаётся для: streaming (SSE, WebSocket), реактивных БД, приложений с очень высокой конкурентностью\n- Тренд: WebFlux для edge-сервисов и API Gateway, MVC + Virtual Threads для бизнес-логики\n\n> **На собеседовании:** важно показать понимание trade-offs, а не просто сказать «WebFlux — реактивный». Назовите модель выполнения (event-loop vs thread-per-request), и когда каждый вариант оправдан. Частая ошибка — не упомянуть, что WebFlux поддерживает два стиля: аннотированные контроллеры и Router Functions.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое Spring WebFlux и чем он отличается от Spring MVC? — Gymterview","Spring WebFlux — реактивный веб-фреймворк в Spring, работающий на неблокирующем сервере (Netty по умолчанию). Является альтернативой Spring MVC для построения а","Spring WebFlux — реактивный веб-фреймворк в Spring, работающий на неблокирующем сервере (Netty по умолчанию). Является а",[7,13],"Spring WebFlux — реактивный веб-фреймворк в Spring, работающий на неблокирующем сервере (Netty по умолчанию). Является альтернативой Spring MVC для построения асинхронных, неблокирующих веб-приложений.",true]