Choosing between Spring Web or Webflux

Andrei Baptista
5 min readMar 29, 2023

--

Although both Spring Web and Spring WebFlux are web frameworks that are a part of the Spring ecosystem, they have various programming styles and are intended for various use cases.

Traditional blocking web framework Spring Web adheres to the Servlet API concept. Applications that call for synchronous communication between clients and servers can use it. Applications like content management systems, social networking websites, and e-commerce websites that must serve many customers at once are best suited for Spring Web.

Reactive web framework Spring WebFlux is built on Reactive Streams and adheres to the Reactive Streams API architecture. It’s intended for use in applications that need a lot of concurrency, scalability, low latency, and high throughput. Spring WebFlux handles many requests concurrently by utilizing non-blocking I/O and reactive programming approaches. Applications like streaming services, chat programs, and real-time analytics systems that must manage a large number of requests in real-time are the best candidates for Spring WebFlux.

Take into account the following elements when deciding between Spring Web and Spring WebFlux:
1. Performance requirements: Spring WebFlux may be a preferable option if your application demands high concurrency, low latency, and high throughput.
2. Asynchronous vs. synchronous communication: Spring Web can be a preferable option if your application needs synchronous communication between clients and servers. Asynchronous communication may be necessary for your application, in which case Spring WebFlux may be a preferable option.
3. Developer background: Spring Web might be a better option if your development team is more at ease with conventional blocking programming patterns. Spring WebFlux may be a better option if your development team is more at ease with reactive programming approaches.

Asynchronous communication: Spring WebFlux is a better option than Spring Web in this situation because it is specifically developed for asynchronous communication.
The request processing model in conventional web frameworks like Spring Web is built on a blocking I/O strategy. This means that when a request is made, the server blocks until the procedure is finished, which may cause clients to wait a lengthy time, especially if there are numerous requests being processed at once. Contrarily, Spring WebFlux makes use of a non-blocking I/O strategy that enables the server to process numerous requests concurrently without blocking. As a result, queries can be handled asynchronously, greatly enhancing the application’s responsiveness and scalability.

Reactive programming strategies can be used by developers with Spring WebFlux to manage asynchronous communication. Reactive programming is a methodology that employs a collection of design patterns to create scalable, durable, and responsive systems. Since it makes it possible for programmers to handle data streams and event-driven programming in a more effective and manageable manner, reactive programming is especially well suited to asynchronous communication.

Additionally, the industry-standard Reactive Streams API for asynchronous communication is supported by Spring WebFlux. This means that since the Reactive Streams API uses a non-blocking I/O approach, supports reactive programming, and makes use of industry-standard APIs, developers can use third-party libraries and frameworks that are built on top of it to improve the performance and dependability of their applications. Developers may create apps that are more responsive, scalable, and effective thanks to these features.

Spring Web Example

In this example, we will create a simple REST API that returns a list of books. We will use Spring Web to handle the requests.

@RestController
public class BookController {

@GetMapping("/books")
public List<Book> getAllBooks() {
// Code to fetch all books from a database or other data source
List<Book> books = bookService.getAllBooks();
return books;
}
}

In the above example, we have created a REST endpoint that maps to the “/books” URI. When a GET request is made to this endpoint, the getAllBooks() method is called, which fetches all books from a database or other data source and returns them as a list.

Spring WebFlux Example

In this example, we will create a similar REST API that returns a list of books. However, this time we will use Spring WebFlux to handle the requests.

@RestController
public class BookController {

@GetMapping("/books")
public Flux<Book> getAllBooks() {
// Code to fetch all books from a database or other data source
Flux<Book> books = bookService.getAllBooks();
return books;
}
}

In the above example, we have created a REST endpoint that maps to the “/books” URI, similar to the Spring Web example. However, this time we have used a Flux<Book> instead of a List<Book>. A Flux is a reactive data stream that can emit zero or more items, and it is used to handle asynchronous communication in Spring WebFlux.

The getAllBooks() method returns a Flux of books, which is fetched from a database or other data source asynchronously. When a GET request is made to this endpoint, the Flux is returned as the response, which emits all the books one by one as soon as they are available.

These are just some examples to give you an idea of how to use Spring Web and Spring WebFlux. There are many other features and capabilities of these frameworks that can be used to build more complex and powerful applications.

Mono and Flux
The Reactive Streams specification, which establishes a norm for asynchronous stream processing with non-blocking back pressure, includes both Mono and Flux. This means that asynchronous data streams that emit zero, one, or many items can be handled by Mono and Flux.
A stream with no more than one element is represented by the type mono. It can be applied to asynchronous tasks that only produce one output, like database searches or REST API calls. When the result is ready, it is emitted to the Mono, where a subscriber can consume it.

Mono<String> messageMono = Mono.just("Hello, World!");

messageMono.subscribe(System.out::println);

In this example, we create a Mono that emits the string "Hello, World!" when subscribed. We then subscribe to the Mono and print the value to the console.

Flux , on the other hand, is a type that represents a stream of zero to many elements. It can be used to handle asynchronous operations that return multiple results, such as a continuous stream of events or a large batch of data. When items are available, they are emitted to the Flux, which can be consumed by a subscriber.

Here is an example of how to use Flux :

Flux<Integer> numbersFlux = Flux.range(1, 10);

numbersFlux.subscribe(System.out::println);

In this example, we create a Flux that emits integers from 1 to 10. We then subscribe to the Flux and print each value to the console. Mono and Flux are fundamental data types in Spring WebFlux that are used to represent asynchronous sequences of data. Mono is used to handle operations that return a single result, while Flux is used to handle operations that return multiple results.

--

--

No responses yet