← Назад к вопросам
Что такое Spring WebFlux и когда его применяют?
3.0 Senior🔥 81 комментариев
#Spring Framework
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Spring WebFlux: Асинхронное и реактивное программирование
Spring WebFlux — это асинхронный реактивный фреймворк для разработки веб-приложений на базе Netty. Он предоставляет полностью неблокирующий стек с потоковой обработкой данных.
Основные концепции
// Реактивные типы
Mono<String> single = Mono.just("Hello");
Flux<String> multiple = Flux.just("A", "B", "C");
// Преобразования
Flux.range(1, 5)
.map(i -> i * 2)
.filter(i -> i > 4)
.subscribe(System.out::println);
Пример REST контроллера
@RestController
@RequestMapping("/api/products")
public class ProductController {
@GetMapping
public Flux<Product> getAll() {
return productService.findAll();
}
@GetMapping("/{id}")
public Mono<Product> getById(@PathVariable Long id) {
return productService.findById(id);
}
@PostMapping
public Mono<Product> create(@RequestBody Mono<Product> product) {
return product.flatMap(p -> productService.save(p));
}
}
Сервис с бизнес-логикой
@Service
public class ProductService {
private final ProductRepository repository;
public Flux<Product> findAll() {
return repository.findAll();
}
public Mono<Product> findById(Long id) {
return repository.findById(id)
.switchIfEmpty(Mono.error(new NotFoundException()));
}
public Mono<Product> save(Product product) {
return repository.save(product);
}
}
public interface ProductRepository extends ReactiveCrudRepository<Product, Long> {
}
Когда применять Spring WebFlux
Когда НАДО использовать:
- Множество конкурентных соединений — тысячи одновременных пользователей
- I/O-bound операции — частые обращения к БД, внешним API
- Real-time данные — WebSockets, Server-Sent Events (SSE)
- Микросервисная архитектура — асинхронное взаимодействие между сервисами
- Streaming данных — обработка больших объёмов данных с низкой задержкой
// WebSocket обработчик
@Bean
public WebSocketHandler webSocketHandler() {
return session -> session.send(
Flux.interval(Duration.ofSeconds(1))
.map(seq -> session.textMessage("Message " + seq))
);
}
Когда НЕ использовать:
- CPU-bound операции — интенсивные вычисления (реактивность не помогает)
- Простые CRUD приложения — Spring MVC будет проще
- Блокирующие зависимости — если вся логика синхронная
- Опыт команды — асинхронный код сложнее отлаживать
- Синхронная БД — если работаете с обычным JDBC
Архитектурный выбор
Spring WebFlux и Spring MVC можно использовать в одном приложении:
// Spring MVC контроллер
@RestController
@RequestMapping("/sync")
public class SyncController {
@GetMapping
public User getUser() { return service.getUser(); }
}
// Spring WebFlux контроллер в том же приложении
@RestController
@RequestMapping("/async")
public class AsyncController {
@GetMapping
public Mono<User> getUser() { return service.getUserAsync(); }
}
Типичный use-case: API шлюз
@Service
public class ApiGateway {
private final WebClient webClient;
public Flux<User> aggregateData(Long userId) {
return Mono.zip(
webClient.get().uri("/users/" + userId).retrieve().bodyToMono(User.class),
webClient.get().uri("/orders/" + userId).retrieve().bodyToFlux(Order.class),
webClient.get().uri("/posts/" + userId).retrieve().bodyToFlux(Post.class)
)
.timeout(Duration.ofSeconds(5))
.retry(2);
}
}
Выбор Spring WebFlux должен быть обоснован реальными требованиями производительности, а не попыткой быть современным.