This article mainly introduces the difference between Webflux and traditional MVC web,and how to integrate it into springboot3.x or 2.x.
一、WebFlux vs WebMVC
Blocking Web (Servlet) and Reactive Web (WebFlux) are two paradigms in Spring Web development, each with distinct characteristics and design principles. Here, we will expand on the differences between them, focusing on various aspects of their implementation and usage.
1. Front Controller
Servlet-Blocking Web: Uses DispatcherServlet
as the front controller. The DispatcherServlet
is responsible for handling all incoming HTTP requests and routing them to appropriate handler methods within the application.
WebFlux-Reactive Web: Uses DispatcherHandler
as the front controller. Similar to DispatcherServlet
, the DispatcherHandler
manages HTTP request routing but is designed to work in a non-blocking, reactive manner, leveraging the reactive streams API.
2. Handler
Servlet-Blocking Web: Uses Controller
as the handler. These controllers are typically annotated with @Controller
or @RestController
and contain methods mapped to specific HTTP routes, handling synchronous request-response cycles.
WebFlux-Reactive Web: Uses WebHandler
or Controller
as the handler. WebHandler
is a functional interface representing a contract for handling web requests reactively. Controllers can also be used, but they must return reactive types like Mono
or Flux
.
3. Request and Response
Servlet-Blocking Web: Uses ServletRequest
and ServletResponse
. These are standard Java EE interfaces representing the request and response objects in a traditional, blocking I/O model.
WebFlux-Reactive Web: Uses ServerWebExchange
, along with ServerRequest
and ServerResponse
. ServerWebExchange
is a central interface in WebFlux that provides access to the HTTP request and response, enabling non-blocking processing.
4. Filters
Servlet-Blocking Web: Uses Filter
(e.g., HttpFilter
). Filters are used to perform filtering tasks on either the request to a resource, the response from a resource, or both. They operate in a blocking manner.
WebFlux-Reactive Web: Uses WebFilter
. Similar to Servlet filters, WebFilter
allows for request and response modification but in a non-blocking, reactive way.
5. Exception Handlers
Servlet-Blocking Web: Uses HandlerExceptionResolver
to handle exceptions. This interface allows the application to define custom exception handling logic for synchronous requests.
WebFlux-Reactive Web: Uses DispatchExceptionHandler
to handle exceptions. This handler is designed for reactive applications and can process exceptions in a non-blocking manner.
6. Web Configuration
Servlet-Blocking Web: Configured via @EnableWebMvc
. This annotation is used to enable Spring MVC and import its default configuration, tailored for blocking, synchronous request processing.
WebFlux-Reactive Web: Configured via @EnableWebFlux
. This annotation enables WebFlux and imports its configuration, optimized for reactive, non-blocking request handling.
7. Custom Configuration
Servlet-Blocking Web: Uses WebMvcConfigurer
. This interface allows customization of the default Spring MVC configuration, such as view resolvers, interceptors, and formatters.
WebFlux-Reactive Web: Uses WebFluxConfigurer
. Similar to WebMvcConfigurer
, this interface provides hooks for customizing WebFlux’s configuration.
8. Return Types
Servlet-Blocking Web: The return type can be any object. Methods in controllers can return simple objects, ModelAndView
, ResponseEntity
, or any other type, which are then processed synchronously.
WebFlux-Reactive Web: The return type can be a Mono
, a Flux
, or any object. Methods in reactive controllers often return Mono
(representing a single asynchronous value) or Flux
(representing a stream of asynchronous values), facilitating non-blocking operations.
9. Sending REST Requests
Servlet-Blocking Web: Uses RestTemplate
to send REST requests. RestTemplate
is a synchronous client to perform HTTP requests and interact with RESTful web services.
WebFlux-Reactive Web: Uses WebClient
to send REST requests. WebClient
is a non-blocking, reactive alternative to RestTemplate
, designed to work seamlessly with reactive programming paradigms.
Core Difference Between Blocking and Reactive Models
Blocking Model (Servlet): Each request is handled by a dedicated thread, which waits for operations to complete (such as da