Какие есть проблемы в использовании REST-класса
Что проверяют
Формулировка размытая, но почти всегда речь о RestTemplate, классе Spring для синхронных HTTP-вызовов. Интервьюер хочет понять, работали ли вы с ним в продакшене: знаете ли про таймауты, пул соединений и обработку ошибок. Следом обычно спрашивают, чем бы вы его заменили сегодня.
Как отвечать
Начните с того, что RestTemplate находится в режиме поддержки. Для нового кода Spring рекомендует RestClient (появился в Spring Framework 6.1) с тем же синхронным стилем и fluent API, а для реактивного стека WebClient. Затем пройдитесь по граблям:
- таймауты: с фабрикой по умолчанию
SimpleClientHttpRequestFactoryна базеHttpURLConnectionтаймауты не заданы, и зависший сервис держит поток бесконечно. Задавайте connect и read timeout явно; - пул соединений: та же фабрика пула не держит. Под нагрузкой подключают
HttpComponentsClientHttpRequestFactoryс Apache HttpClient 5 и настраивают лимиты пула на хост; - ошибки:
DefaultResponseErrorHandlerбросаетHttpClientErrorExceptionна 4xx иHttpServerErrorExceptionна 5xx. Тело ошибки достают из исключения или пишут свойResponseErrorHandler; - дженерики:
getForObject(url, List.class)вернёт списокLinkedHashMap. ДляList<UserDto>нуженexchangeсParameterizedTypeReference; - блокирующая модель: каждый вызов занимает поток на всё время ответа. На виртуальных потоках Java 21 это заметно дешевле, но пул соединений всё равно остаётся узким местом;
- нет повторов и circuit breaker: их добавляют через Spring Retry или Resilience4j.
Отдельно скажите, что экземпляр потокобезопасен после настройки, и в Spring Boot его создают один раз как бин через RestTemplateBuilder: так подключаются метрики и трейсинг.
Где спотыкаются
Создают new RestTemplate() внутри метода на каждый запрос. Теряются настройки, метрики и переиспользование соединений.
Не ставят таймауты, а потом один медленный внешний сервис выедает весь пул потоков Tomcat, и падает уже ваше приложение.
Передают строку с уже закодированными параметрами в метод, принимающий шаблон URL, и получают двойное кодирование вида %2520. Если адрес собран заранее, передавайте объект URI.