Does Spring WebFlux automatically close connections when using .retrieve() or .exchange()? - spring

We recently switched from a JAX RS-based WebClient to Spring's reactive WebFlux client. As we had problems with the old client retaining connections in some cases, we were wondering how the WebFlux client treats those. Unfortunately, Spring's documentation for WebFlux doesn't provide details on this, only in the context of WebSockets. So: Does calling .retrieve() or .exchange() automatically close connections? Or do we need to take care of that on our own?

Related

Can I use Spring's WebClient for the synchronous app, and what are the alternatives?

I am creating a Spring Boot MVC application, with Tomcat and JDBC. My app will be an API client, I've learned that I'll need RestTemplate class for API requests. But since Spring 5, RestTemplate is in maintenance mode and will be deprecated in the future.
The alternative is a WebClient class, which is powerful and useful for testing also. But it supports a reactive WebFlux stack.
For example, when I watched this tutorial on how to make tests with WebClient I was very confused:
https://www.youtube.com/watch?v=kGK9Hf8cnBw
I must use these Mono and Flux types?
My first question is, can I use WebClient to make a classic servlet-based app (with Tomcat, and JDBC/JPA like I used to)?
If not, what is an alternative to WebClient and RestTemplate?
WebClient can be used in synchronous style by blocking at the end for the result like this:
Person project = client.get().uri("/project/{id}", i).retrieve()
.bodyToMono(Project.class)
.block();
List<Person> projects = client.get().uri("/projects").retrieve()
.bodyToFlux(Project.class)
.collectList()
.block();
Here we use block() to block the stream and get the data out of it. Note that this shouldn’t be used in a reactive environment.
This is late but someone might benefit from this.. You can use open feign.. Check it out

Spring Webclient versus Feign client

Hi I am looking detail comparision between spring webclient and feignclient. As I understand webclient replace resttemplate and extra features reactive client, retry, exception handling vs. Is there Any known sceneraio feign client do but webclient doesnt. I prefer to stay spring ecosystem rather than use external library.For that reason I think to give up using feign client , and start to use webclient. Is there Any issue about or experience about that. Thanks

SpringBoot FeignClient vs WebClient

I want to consume a couple of rest services. Before I have used RestTemplate, but now I want to know What is main diffrences of SpringBoot FeignClient and WebClient?
when they should be used?
To be able to answer “when” one needs to understand the capabilities of each.
Spring WebClient is a non-blocking reactive client to make HTTP requests. Hence if you intend to use Spring Reactive Stream API to stream data asynchronously then this is the way to go. Think event-driven architecture. WebClient is part of the Spring WebFlux library.
[Feign]3 is a declarative REST library that uses annotations based architecture with thread-per-request model. This means that the thread will block until the feign client receives the response. The problem with the blocking code is it must wait until the consuming thread completes, hence think memory and CPU cycles.
So use Spring WebClient when needing non-blocking HTTP requests otherwise Feign due to simple usage model.
(Note: There is no reason as to why one cannot use WebClient for blocking operations but Feign is more mature and it’s annotation based model makes it easier)
The main difference is that WebClient supports Reactive calls.
You can achieve that with 3rd party feign clients like https://github.com/Playtika/feign-reactive but basically for a reactive way you should consider using WebClient with some neat async connector like Jetty. On the other hand, If you want a blocking way with minimal hassle then Feign could be your best choice.
WebClient is a non-blocking reactive.
Feign is blocking.

Spring boot reactive WebClient calling legacy endpoint

In a Spring Boot (2.2.2.RELEASE) application, I have reactive endpoints (returning Mono or Flux), each of them is using reactive WebClient for calling another service. This "other" service is legacy (non-reactive) one.
Here is my question:
Is there a benefit of using Webflux (reactive WebClient) if my reactive endpoint is calling this non-reactive endpoint which does blocking stuff?
Is my reactive endpoint still reactive?
If we're talking about HTTP endpoints, we can call them with blocking or non-blocking (asynchronous) clients, but not fully reactive.
If your "new" application is reactive, you have to use non-blocking client (WebClient in your case), otherwise you will block NIO-threads and loose all the advantages of the reactive approach. The fact that the “other” application is blocking doesn't matter, you can still get a less resource-intensive "new" application.
They are
1. Not fully.
2. Your request is not full reactive until you change legacy APIs
Explanation:
End-to-End Reactive pattern only help into to the performance side
Currently you’re using reactive client this helps to connect to server in two way communication.
First set of APIs are reactive so web server layer is now reactive but data layer (Legacy APIs ) not reactive

Can I use a standalone WebClient without Webflux

I'm developing a reactive service and preparing to use the WebClient to exchange with HTTP APIs,but the service is not in a reactive web stack so how can I use it(WebClient) without depending on Webflux or is there any alternative reactive HTTP client?
Thanks in advance.
I am not sure if I get your question correct: You want to use an inherently reactive class without the reactive lib in which it is contained?
As you can see via the link you put in your question, the WebClient is part of spring-webflux and depends e.g. on reactor.core.publisher.Mono which resides in compile("io.projectreactor:reactor-core"). I can not imagine any scenario in which this WebClient would work or make any sense as you've asked "without depending on Webflux".
Other reactive HTTP clients are:
RxHttpClient
Java HTTP Client introduced in Java 11
May be you could elaborate a little bit more on your needs, why you won't rely on WebFlux or why you want to use a reactive client in a non-reactive stack.

Resources