В чем разница между Feign client и RestTemplate
Что проверяют
Понимаете ли вы разницу между декларативным и императивным HTTP-клиентом и знаете ли, в каком состоянии оба инструмента сейчас. Следом почти всегда спрашивают, что бы вы взяли в новый проект на Spring Boot и как настраиваете таймауты и обработку ошибок.
Как отвечать
Начните с сути подходов:
- RestTemplate: императивный синхронный клиент из Spring Framework. Каждый вызов вы собираете сами: URL, заголовки,
exchange()илиgetForObject(), разбор ответа. По умолчанию работает черезSimpleClientHttpRequestFactoryнаHttpURLConnection, где таймауты не заданы вовсе; - Feign (Spring Cloud OpenFeign): декларативный клиент. Вы описываете интерфейс с
@FeignClientи привычными@GetMapping,@PathVariable, включаете@EnableFeignClients, а реализацию генерирует прокси. Ошибки разбираются черезErrorDecoder, общие заголовки добавляетRequestInterceptor, повторы настраиваются черезRetryer; - балансировка: у Feign она подключается через Spring Cloud LoadBalancer по имени сервиса из реестра, у RestTemplate через бин с
@LoadBalanced. Ribbon из Spring Cloud давно удалён.
Главное про сегодняшний день: оба инструмента в режиме поддержки. RestTemplate новых возможностей не получает со времён Spring 5, команда Spring рекомендует RestClient из Spring Framework 6.1 с fluent API в духе WebClient. OpenFeign объявлен feature-complete, а его нишу заняли HTTP-интерфейсы Spring: интерфейс с @GetExchange и @PostExchange, реализацию которого строит HttpServiceProxyFactory поверх RestClient. По сути это Feign, встроенный во фреймворк.
Итог: декларативный стиль удобен, когда клиентов много и API стабилен, императивный нужен для нестандартных запросов, стриминга и тонкой работы с ответом.
Где спотыкаются
Называют RestTemplate удалённым. Он работает и поддерживается, просто развивается теперь RestClient.
Не знают про таймауты. new RestTemplate() без настроенной фабрики может ждать ответа бесконечно, а у Feign свои значения по умолчанию, которые стоит переопределять под каждый сервис.
Считают Feign асинхронным или реактивным. Spring Cloud OpenFeign блокирующий, для реактивного стека нужен WebClient.