WebClient против RestTemplate

По весне 5:

WebClient - это интерфейс, представляющий основную точку входа для выполнения веб-запросов.

Он был создан как часть модуля Spring Web Reactive и будет заменять классический RestTemplate в этих сценариях. Новый клиент - реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.

Означает ли это, что нам нужно перекодировать старые приложения, используя RestTemplate, если мы хотим перейти на Spring 5?

Или есть какой-то обходной путь для работы с RestTemplate в Spring 5?

6 ответов

Решение

Нет, RestTemplate будет продолжать существовать. Вам не нужно заменять его на WebClient.
Одним из основных отличий RestTemplate является синхронность и блокировка. то есть, когда вы делаете перерыв, вам нужно подождать, пока ответ не вернется, чтобы продолжить.

Но WebClient является полной противоположностью этому. Звонящий не должен ждать, пока ответ не вернется. Вместо этого он будет уведомлен, когда есть ответ.

Если вам нужна такая функциональность, тогда да, вам нужно заменить Resttemplate на WebClient.
Вы можете изменить шаблон Rest, например, синхронную обработку в веб-клиенте, используя .block(), Но другой путь невозможен.

Согласно Java Doc, RestTemplate будет устаревшим. Команда Spring советует использовать WebClient, если это возможно:

ПРИМЕЧАНИЕ. Начиная с версии 5.0 неблокирующая реактивная функция org.springframework.web.reactive.client.WebClient предлагает современную альтернативу RestTemplate с эффективной поддержкой синхронизации и асинхронности, а также сценариев потоковой передачи. RestTemplate будет объявлен устаревшим в будущей версии, и в будущем не будут добавлены новые важные функции.

Согласно объявлению , в Spring 6.1 и Spring Boot 3.2 появилась совершенно новая опция под названиемRestClient:

Spring Framework 6.1 M2 представляет RestClient, новый синхронный HTTP-клиент . Как следует из названия, RestClient предлагает свободный API WebClient с инфраструктурой RestTemplate.

      RestClient restClient = RestClient.create();

String result = restClient.get()
  .uri("https://example.com")
  .retrieve()
  .body(String.class);

На основе JavaDocRestTemplate, теперь это рекомендуемая замена:

ПРИМЕЧАНИЕ . Начиная с версии 6.1, RestClient предлагает более современный API для синхронного доступа HTTP.

Новый RestClient также можно использовать с недавно представленным декларативным интерфейсом HTTP без включения Webflux в путь к классам.

      RestClient restClient = RestClient.builder().baseUrl("https://api.github.com/").build();
RestClientAdapter adapter = RestClientAdapter.create(restClient);
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builderFor(adapter).build();

RepositoryService service = factory.createClient(RepositoryService.class);

на самом деле не устарел. Но это не будет развиваться в будущем. Так что придерживаться совершенно правильно, если вы делаете то, что вам нужно.

Другой способ выразить это так: если вам нужны определенные шаблоны использования, такие как потоковая передача, разброс / сборщик или настраиваемые тайм-ауты, это не будет покрываться RestTemplate и вам нужно использовать вместо этого.

Теперь используя WebClientв блокирующем приложении тоже нормально. С использованием block() не должно повредить там, и контроллер Spring MVC частично поддерживает реактивные типы возврата.

WebClient является Неблокирующий клиент, RestTemplate является блокировка клиента.

Весна уже давно служит веб-покупателем. Под капотом RestTemplate использует API Java API, который основан на предметной модели. Это означает, что вопрос будет заблокирован до тех пор, пока клиент не получит ответ. Проблема с кодом блокировки связана с существованием какой-либо строки циклов памяти и процессора. Рассмотрим множество приложений, которые ждут невысоких сервисов, необходимых для выдачи результата. Рано или поздно запросы результатов собираются. В результате программа создает множество проблем, которые приводят к истощению пула потоков или заполнению всей доступной памяти. Мы также можем оценить производительность благодаря переключению процессора.

Spring WebClient против RestTemplate

WebClient поддерживает как синхронные, так и асинхронные вызовы. RestTemplate поддерживает только синхронные вызовы. Никаких изменений в старом коде не требуется, даже если RestTemplate является устаревшим (если вам не требуется асинхронное поведение)

Другие вопросы по тегам