Spring WebFlux

Тема дорожной карты · Spring Boot

Spring WebFlux — полностью неблокирующий реактивный веб-фреймворк в экосистеме Spring, представленный в составе Spring Framework 5 и доступный в Spring Boot через spring-boot-starter-webflux, созданный для замены Spring MVC в сценариях, требующих высокой конкурентности, низкой задержки или потоковых данных. Spring WebFlux работает на Netty по умолчанию (или на Undertow/Jetty в неблокирующем режиме Servlet 3.1+) и обрабатывает все запросы на небольшом пуле потоков событийного цикла, причём методы-обработчики @RestController возвращают Mono<T> или Flux<T> из Project Reactor для представления асинхронных одиночных и многозначных ответов соответственно. Фреймворк поддерживает как аннотированную модель программирования — @GetMapping, @PostMapping, @RequestBody, @PathVariable — так и функциональный DSL маршрутизации с использованием RouterFunction и HandlerFunction, позволяя разработчикам выбрать стиль, соответствующий предпочтениям команды. Spring WebFlux интегрируется с Spring Security для реактивной аутентификации запросов через ReactiveSecurityContextHolder, с реактивными репозиториями Spring Data (ReactiveCrudRepository, ReactiveMongoRepository, R2dbcRepository) и с WebClient для неблокирующих исходящих HTTP-вызовов, формируя полный реактивный стек от HTTP-входа до персистентности. Приложения Spring WebFlux просто тестируются с WebTestClient, предоставляющим fluent API утверждений поверх mock-сервера или реального Netty-экземпляра, запущенного с @SpringBootTest(webEnvironment = RANDOM_PORT), и они генерируют метрики Micrometer, совместимые с Prometheus и Grafana, для наблюдаемости в Kubernetes-развёртываниях.

Как это работает

Spring WebFlux: Spring WebFlux — non-blocking reactive стек на Project Reactor (типы Mono + Flux). Вместо one thread per request (Servlet), маленький thread pool handle-ит много concurrent запросов через event loop. R2DBC — reactive DB driver, аналог JDBC. WebClient (non-blocking, reactive HTTP-клиент) заменяет RestTemplate. Reactive код читается иначе: цепочки операторов (map, flatMap, filter) вместо imperative. Big learning curve, реальная польза только на high concurrency.

Когда применять

WebFlux только когда (а) huge fan-out + нужен backpressure, (б) streaming, (в) downstream reactive end-to-end. Смешение blocking JDBC в reactive-флоу убивает суть (offloading осторожно). Для типичного CRUD MVC + Servlet проще, debuggable, достаточно быстро. Virtual threads (JDK 21+) закрывают gap для многих случаев — рассмотрите до WebFlux.

Типичные ошибки

Ловушки Spring WebFlux: blocking calls внутри reactive-цепочек (убивает модель + deadlocks); reactive везде "потому что быстрее" (медленнее для wrong shape работы); сложнее debugging (stack traces бесполезны; checkpoint() + reactor debug agent); over-use flatMap, когда map работает.

Связанные понятия

Полезные ресурсы