Ответ
RestTemplate — это синхронный, блокирующий HTTP-клиент, основанный на шаблоне проектирования Template Method. WebClient — это реактивный, неблокирующий клиент, часть Spring WebFlux.
Ключевые различия:
| Критерий | RestTemplate | WebClient |
|---|---|---|
| Парадигма | Императивная, синхронная | Реактивная, асинхронная (на основе Project Reactor) |
| Блокировка | Блокирует поток на время запроса | Неблокирующий, эффективно использует ресурсы |
| Конкурренция | Ограничена пулом потоков | Поддерживает высокую конкурренцию на少量 потоках |
| API | Основан на шаблонных методах | Функциональный, fluent API (цепочка вызовов) |
| Зависимости | Часть Spring MVC | Часть Spring WebFlux (требует spring-boot-starter-webflux) |
Пример RestTemplate (синхронный):
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("https://api.example.com/data", String.class);
System.out.println(result); // Блокируется здесь
Пример WebClient (асинхронный):
WebClient client = WebClient.create();
Mono<String> resultMono = client.get()
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class);
resultMono.subscribe(System.out::println); // Не блокирует основной поток
Когда использовать:
- RestTemplate: Для простых синхронных вызовов в традиционных Spring MVC приложениях.
- WebClient: Для реактивных стеков (WebFlux), микросервисов с высокой нагрузкой или когда нужна неблокирующая обработка множества параллельных запросов.
Ответ 18+ 🔞
Да ты посмотри, какая дичь! Сидишь ты такой, пишешь свой сервис, и тут бац — нужно к другому сервису сходить, данные стянуть. И встаёт вопрос, блядь, классический: брать старый добрый RestTemplate или этот новый, реактивный WebClient? Ёпта, выбор-то нехилый, сейчас разберём.
RestTemplate — это как старый, проверенный ЗИЛ. Синхронный, блять. Ты ему сказал «поехали», и он поехал, а ты ждёшь, пока он туда-сюда съездит, и поток твой на это время просто спит, как сурок. Шаблонный метод, всё чинно-благородно, но если запросов много — потоки кончатся, и приложение встанет колом, в рот меня чих-пых!
А WebClient — это уже реактивный спорткар. Неблокирующий, ёбана! Он не ждёт ответа, как лох. Отправил запрос и пошёл дальше дела делать, а когда ответ приплывёт — он тебе сигнал даст. Всё на основе этого самого Project Reactor, который сейчас у всех на устах.
Короче, в чём разница, чтобы до ебеней дошло:
| Критерий | RestTemplate | WebClient |
|---|---|---|
| Как работает | Императивно, по старинке. | Реактивно, по-модному. |
| Блокирует? | Да, блядь, поток встаёт раком. | Нет, поток свободен, как ветер. |
| Много запросов | Утонет в своих же потоках. | Вывезет овердохуищу на паре потоков. |
| Как выглядит | Вызываешь метод — получаешь ответ. | Цепочка вызовов, fluent API, красота. |
| Что нужно | Spring MVC, он там из коробки. | Spring WebFlux, надо отдельно подключать. |
Вот смотри, как по-старосоветски, на RestTemplate:
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("https://api.example.com/data", String.class);
System.out.println(result); // Сиди и жди тут, пока не приедет!
А теперь, блядь, веб-клиент в деле:
WebClient client = WebClient.create();
Mono<String> resultMono = client.get()
.uri("https://api.example.com/data")
.retrieve()
.bodyToMono(String.class);
resultMono.subscribe(System.out::println); // Отправил и пошёл пить чай, ответ придёт сам!
Так когда что брать?
- RestTemplate: Если у тебя простенькое MVC-приложение, запросы разовые и по-тихому. Не надо тут реактивность разводить.
- WebClient: Если твой сервис — это микросервис в облаке, который должен десять тысяч запросов в секунду обрабатывать, не вспотев. Или если весь твой стек на WebFlux завязан. Вот тогда — только он, ебать его в сраку!