В чем разница между Spring Boot Starter Web и Starter WebFlux?

«В чем разница между Spring Boot Starter Web и Starter WebFlux?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Boot Starter Web использует синхронный, блокирующий стек на основе Spring MVC и сервлетов (Tomcat по умолчанию). Подходит для традиционных приложений с реляционными БД и шаблоном Thread-per-Request.

Spring Boot Starter WebFlux построен на реактивном стеке Project Reactor, использует неблокирующий I/O (Netty по умолчанию) и модель event-loop. Предназначен для высоконагруженных систем, микросервисов и потоковой обработки с поддержкой backpressure.

Ключевые отличия:

  • Архитектура: Синхронная (Web) vs. Асинхронная, неблокирующая (WebFlux).
  • Модель потоков: Thread-per-Request (Web) vs. Малое число потоков event-loop (WebFlux).
  • Зависимости: Servlet API (Web) vs. Reactive Streams (WebFlux).
  • Конкурентность: Лучше для CPU-интенсивных задач (Web) vs. Лучше для I/O-интенсивных задач (WebFlux).

Пример контроллера WebFlux:

@RestController
public class UserController {
    @GetMapping("/users")
    public Flux<User> getAllUsers() {
        return userRepository.findAll(); // Возвращает реактивный поток
    }
}

Когда выбирать:

  • Web: Классические CRUD-приложения, интеграция с блокирующими библиотеками (JPA, JDBC).
  • WebFlux: Высокий параллелизм, потоковые API, интеграция с неблокирующими клиентами.