Какие варианты реализации REST клиента в Spring существуют
Что проверяют
Знаете ли вы, какой клиент выбирать сегодня, а не только RestTemplate из старых туториалов. Следом обычно спрашивают, чем RestClient отличается от WebClient и как вы настраиваете таймауты и обработку ошибок.
Как отвечать
Перечислите варианты с назначением:
RestTemplate: синхронный клиент с шаблонными методами вродеgetForObject. Работает, но давно в режиме поддержки и новых возможностей не получает, для нового кода Spring рекомендуетRestClient;RestClient: появился в Spring Framework 6.1 (Spring Boot 3.2). Синхронный, с текучим API в стилеWebClient:restClient.get().uri(...).retrieve().body(User.class). Использует ту же инфраструктуру, чтоRestTemplate: конвертеры сообщений, интерцепторы, фабрики запросов;WebClient: неблокирующий клиент из Spring WebFlux, возвращаетMonoиFlux. Нужен в реактивном стеке и там, где много параллельных вызовов на небольшом пуле потоков. Требует зависимостьspring-webflux;- HTTP-интерфейсы: объявляете интерфейс с
@GetExchange,@PostExchange, а реализацию генерируетHttpServiceProxyFactoryповерхRestClientилиWebClient. Декларативно и без Spring Cloud; - Spring Cloud OpenFeign:
@FeignClientи@EnableFeignClients. Популярен в микросервисах, но проект объявлен завершённым по функциональности, и для нового кода чаще берут HTTP-интерфейсы.
Отдельно скажите про транспорт: под любым клиентом стоит HTTP-библиотека (JDK HttpClient, Apache HttpClient 5, Jetty, Reactor Netty), и именно она задаёт пул соединений и таймауты. В Spring Boot клиент лучше собирать из автоконфигурированного RestClient.Builder: так подключатся метрики и трассировка.
Где спотыкаются
Тащат WebFlux в обычное Spring MVC приложение ради WebClient и тут же вызывают .block(). Выгоды от неблокирующего клиента нет, а зависимостей больше.
Создают new RestTemplate() на каждый запрос и не задают таймауты. Без таймаутов зависший внешний сервис держит поток сколько угодно.
Говорят, что RestTemplate удалён. Он по-прежнему есть и работает, просто не развивается. Правильная формулировка: для нового кода есть RestClient.