← Назад к вопросам

Что такое 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

Когда НАДО использовать:

  1. Множество конкурентных соединений — тысячи одновременных пользователей
  2. I/O-bound операции — частые обращения к БД, внешним API
  3. Real-time данные — WebSockets, Server-Sent Events (SSE)
  4. Микросервисная архитектура — асинхронное взаимодействие между сервисами
  5. Streaming данных — обработка больших объёмов данных с низкой задержкой
// WebSocket обработчик
@Bean
public WebSocketHandler webSocketHandler() {
    return session -> session.send(
        Flux.interval(Duration.ofSeconds(1))
            .map(seq -> session.textMessage("Message " + seq))
    );
}

Когда НЕ использовать:

  1. CPU-bound операции — интенсивные вычисления (реактивность не помогает)
  2. Простые CRUD приложения — Spring MVC будет проще
  3. Блокирующие зависимости — если вся логика синхронная
  4. Опыт команды — асинхронный код сложнее отлаживать
  5. Синхронная БД — если работаете с обычным 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 должен быть обоснован реальными требованиями производительности, а не попыткой быть современным.