Ответ
Spring Reactive (Spring WebFlux) — это полностью асинхронный, неблокирующий, реактивный стек для построения веб-приложений в Spring, поддерживающий обратную нагрузку (backpressure).
Ключевые концепции:
- Реактивное программирование: Работа с потоками данных (
Publisher) черезMono(0-1 элемент) иFlux(0-N элементов) из Project Reactor. - Неблокирующий ввод-вывод: Позволяет обрабатывать больше одновременных запросов с небольшим фиксированным числом потоков, что эффективно для I/O-интенсивных задач.
- Функциональная модель: Помимо аннотированных контроллеров, поддерживает функциональные эндпоинты через
RouterFunction.
| Сравнение с Spring MVC: | Аспект | Spring MVC (Императивный) | Spring WebFlux (Реактивный) |
|---|---|---|---|
| Парадигма | Блокирующая, thread-per-request | Неблокирующая, event-loop | |
| Контейнер | Tomcat, Jetty (Servlet API) | Netty, Servlet 3.1+ | |
| Лучше для | Приложений с CPU-интенсивной логикой | Высоконагруженных, потоковых или I/O-интенсивных приложений |
Пример реактивного контроллера:
@RestController
@RequestMapping("/reactive/users")
public class ReactiveUserController {
private final ReactiveUserService userService;
@GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<User> streamAllUsers() {
return userService.findAllUsers(); // Возвращает Flux<User>
}
@GetMapping("/{id}")
public Mono<User> getUser(@PathVariable String id) {
return userService.findUserById(id); // Возвращает Mono<User>
}
}
Используйте WebFlux, когда нужна высокая конкурентность с малым числом потоков, но учитывайте сложность отладки и ограниченную поддержку блокирующих библиотек (например, JDBC).