Зачем нам переходить с 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 настройке, в зависимости от того, насколько широко вы хотите применить настройки.
- Чтобы максимально сузить объем любых настроек, введите автоматически настроенный
WebClient.Builder, а затем вызовите его методы по мере необходимости.WebClient.Builderэкземпляры сохраняют состояние: любое изменение в построителе отражается на всех клиентах, впоследствии созданных с его помощью. Если мы хотим создать несколько клиентов с одним и тем же построителем, мы также можем рассмотреть возможность клонирования построителя с помощьюWebClient.Builder other = builder.clone();. - Чтобы выполнить аддитивную настройку всех
WebClient.Builderэкземпляров в масштабе всего приложения, вы можете объявитьWebClientCustomizerbeans и изменитьWebClient.Builderлокально в точке внедрения. - Наконец, мы можем вернуться к исходному 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(newString[]{"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. Если вы найдете эту статью полезной, пожалуйста, отпустите несколько аплодисментов и не стесняйтесь поделиться статьей.