В чем разница между WebClient и RestTemplate в Spring?

Ответ

WebClient — современный, реактивный HTTP-клиент. RestTemplate — устаревший, синхронный клиент (в Spring 5 помечен как @Deprecated).

Сравнительная таблица:

Характеристика RestTemplate WebClient
Модель Синхронная, блокирующая (Servlet API) Асинхронная, неблокирующая (Reactive Streams)
Потоки Занимает поток на время запроса Использует малое количество потоков (Event Loop)
HTTP/2 Ограниченная поддержка Полная поддержка
Зависимости spring-web spring-webflux
Стиль API Императивный, на основе шаблона Декларативный, fluent API

Примеры кода:

RestTemplate (Синхронный):

RestTemplate rt = new RestTemplate();
String result = rt.getForObject("https://api.example.com/data", String.class); // Блокировка потока
System.out.println(result);

WebClient (Асинхронный):

// Неблокирующий вызов
WebClient.create()
    .get()
    .uri("https://api.example.com/data")
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(result -> System.out.println("Получено: " + result));

// Или блокирующее ожидание (если необходимо)
String result = WebClient.create()
    .get()
    .uri(uri)
    .retrieve()
    .bodyToMono(String.class)
    .block();

Рекомендация: Для новых проектов на Spring 5+ используйте WebClient. Он обеспечивает лучшую масштабируемость за счет неблокирующей модели и является частью реактивного стека Spring.

Ответ 18+ 🔞

Да ты посмотри, какая история-то разворачивается! Сидят два HTTP-клиента, как два брата, только один — старый, заслуженный дедок, а второй — молодой, реактивный выскочка. И дедку, RestTemplate, уже на пенсию собираются, помечают его @Deprecated, мол, отдохни, старина, мы тут по-новому будем.

Ну и что у нас по факту?

Что сравниваем RestTemplate (Дедок) WebClient (Молодой и дерзкий)
Как работает Синхронно, по-старинке. Запрос сделал — сиди, жди ответа, поток занят. Асинхронно, неблокирующе. Сделал запрос и пошёл дальше дела вершить, а ответ тебе прилетит, когда будет готов.
Потоки Жрёт их, как не в себя. Каждый запрос — отдельный поток в ожидании. Экономный, как шотландец. Мало потоков использует, работает на event loop'ах.
HTTP/2 Поддержка есть, но так, сбоку бантик, не полноценная. Поддерживает на ура, со всеми плюшками.
Что нужно в проект Достаточно spring-web, старый добрый модуль. Требует spring-webflux, реактивщину подтянуть.
Стиль API Императивный, шаблонный. Классика, но скучновато. Декларативный, fluent API. Прям как стихи писать: точка, точка, запятая — и готово.

И вот смотри, как они кодят:

RestTemplate (Дедок, который всё заблокирует):

RestTemplate rt = new RestTemplate();
String result = rt.getForObject("https://api.example.com/data", String.class); // Сиди и жди, пока мир повернётся
System.out.println(result);

WebClient (Юный реактивный гений):

// Сделал и забыл, живёшь дальше
WebClient.create()
    .get()
    .uri("https://api.example.com/data")
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(result -> System.out.println("Получено, ёпта: " + result));

// Или, если уж совсем припёрло и нужно синхронно (но это неспортивно!)
String result = WebClient.create()
    .get()
    .uri(uri)
    .retrieve()
    .bodyToMono(String.class)
    .block(); // Ну вот, испортил всю малину, превратил в дедка!

Итог, блядь: Если пишешь новый проект на Spring 5 и выше — даже не думай, бери WebClient. Это как пересаживаться с запряжённой лошади на электровелосипед. Масштабируемость — овердохуичная, ресурсы экономит, да и будущее уже за реактивной моделью. А дедка RestTemplate пусть в легаси-проектах доживает свой век, в рот меня чих-пых.