Зачем нам переходить с RestTemplate на WebClient?

Мы используем RestTemplate для звонков в другие службы, но насколько это лучший вариант? RestTemplate будет объявлен устаревшим в будущей версии, и в будущем в него не будут добавлены основные новые функции. Давайте посмотрим, как мы можем использовать WebClient для вызовов других сервисов отдыха и чем он лучше RestTemplate.

RestTemplate в Spring Boot

RestTemplate - это центральный класс в среде Spring для выполнения синхронных HTTP-запросов на стороне клиента. Он очень похож на JdbcTemplate, JmsTemplate и другие различные шаблоны, имеющиеся в Spring Framework. Мы можем использовать RestTemplate, используя только одну зависимость.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Зависимость spring-boot-starter-web - это стартер для создания веб-приложений. Эта зависимость содержит класс RestTemplate. RestTemplate поддерживает все методы HTTP.

RestTemplate использует API сервлетов Java, который основан на модели потока за запрос. Это означает, что поток будет заблокирован, пока веб-клиент не получит ответ. Проблема с кодом блокировки связана с тем, что каждый поток потребляет некоторый объем памяти и циклов ЦП.

Если мы используем HttpClient, то нам нужно передать параметры запроса и (или) формы, настроить заголовки принятия и выполнить демаршалинг ответа, и все это мы сами, но RestTemplate снимает всю эту боль и абстрагирует от нас все эти процессы.

WebClient при загрузке Spring

WebClient был представлен в Spring 5 как часть реактивного веб-фреймворка, который помогает создавать реактивные и неблокирующие веб-приложения. Основное преимущество использования WebClient заключается в том, что он является реактивным, поскольку он использует Webflux, а также по своей природе неблокирующий, и ответ всегда будет возвращаться либо в Mono, либо в Flux. Мы можем использовать WebClient, добавив в наш проект единственную зависимость.

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

Spring WebFlux - это параллельная версия Spring MVC, поддерживающая полностью неблокирующие реактивные потоки. Он поддерживает концепцию противодавления и использует Netty в качестве встроенного сервера для запуска реактивных приложений. Если вы знакомы со стилем программирования Spring MVC, вы также можете легко работать с webflux.

Spring webflux использует реактор проекта в качестве реактивной библиотеки. Реактор представляет собой библиотеку Reactive Streams, поэтому все его операторы поддерживают неблокирующее противодавление. Он разработан в тесном сотрудничестве со Spring.

Существует три основных подхода к WebClient настройке, в зависимости от того, насколько широко вы хотите применить настройки.

  1. Чтобы максимально сузить объем любых настроек, введите автоматически настроенный WebClient.Builder, а затем вызовите его методы по мере необходимости. WebClient.Builder экземпляры сохраняют состояние: любое изменение в построителе отражается на всех клиентах, впоследствии созданных с его помощью. Если мы хотим создать несколько клиентов с одним и тем же построителем, мы также можем рассмотреть возможность клонирования построителя с помощью WebClient.Builder other = builder.clone();.
  2. Чтобы выполнить аддитивную настройку всех WebClient.Builder экземпляров в масштабе всего приложения, вы можете объявить WebClientCustomizer beans и изменить WebClient.Builder локально в точке внедрения.
  3. Наконец, мы можем вернуться к исходному API и использовать WebClient.create(). В этом случае автоконфигурация или WebClientCustomizer не применяется.

Реализация RestTemplate и WebClient в Spring Boot

Реализация RestTemplate довольно проста, мы просто даем адрес конечной службы отдыха, а также какой HTTP-метод выполнить и какой будет возвращаемый тип. WebClient немного сложен, мы сначала создаем экземпляр WebClient с адресом назначения, затем мы создаем его, указав необходимые параметры на основе наших требований, поэтому мы указываем URI целевой службы отдыха и используем bodyToMono, который я объясню в немного, что сопоставляет его с указанным типом класса.

Spring WebFlux активно использует двух издателей:

  • Mono: возвращает 0 или 1 элемент.
Mono<String> mono = Mono.just("Vinesh");
Mono<String> mono = Mono.empty();
  • Flux: возвращает 0… N элементов. Flux может быть бесконечным, что означает, что он может испускать элементы бесконечно.
Flux<String> flux = Flux.just("A", "B", "C");
Flux<String> flux = Flux.fromArray(new String[]{"A", "B", "C"});
Flux<String> flux = Flux.fromIterable(Arrays.asList("A", "B", "C"));
//To subscribe call method
flux.subscribe();

В приведенном выше примере я использовал mono, поскольку это единственная строка, которую я буду получать, но если это поток данных, вы также можете использовать flux.

Это суммирует различия между RestTemplate и WebClient и дает общее представление о том, как их реализовать в Spring Boot. Если вы найдете эту статью полезной, пожалуйста, отпустите несколько аплодисментов и не стесняйтесь поделиться статьей.