RestTemplate
RestTemplate — синхронный HTTP-клиент Spring. Он преобразует Java-объекты через message converters и блокирует вызывающий поток до ответа.
Для нового синхронного кода в современных версиях Spring существует RestClient, для реактивной цепочки — WebClient. RestTemplate остаётся распространённым в существующих приложениях и поддерживается, но его API не является единственным выбором.
Настройка как bean
@Bean
RestTemplate catalogClient(RestTemplateBuilder builder) {
return builder
.connectTimeout(Duration.ofSeconds(2))
.readTimeout(Duration.ofSeconds(3))
.build();
}ProductResponse product = restTemplate.getForObject(
baseUrl + "/products/{id}",
ProductResponse.class,
id
);Не создавать клиент на каждый запрос: factory может управлять пулом соединений, TLS и тайм-аутами.
Что обязательно решить
- connect timeout;
- response/read timeout;
- максимальный размер тела;
- pool и очередь ожидания соединения;
- обработка кодов и тела ошибки;
- correlation/trace headers;
- повторы только для безопасных операций;
- метрики latency, status и exhaustion.
Retry без идемпотентности может выполнить изменение дважды. Ошибка чтения ответа не доказывает, что сервер не обработал запрос.
Типичные сбои
- default timeout превращает зависание партнёра в исчерпание thread pool;
- новый client на каждый вызов лишает connection reuse;
- логируется token или персональное тело;
- все
4xx/5xxпревращаются в одну неразличимую ошибку; - URL строится из непроверенного пользовательского ввода и создаёт SSRF.
Вопросы для повторения
- RestTemplate неблокирующий? Нет.
- Какие timeout нужны? Как минимум соединения и ожидания ответа; также важна очередь пула.
- Можно ли retry любого POST? Нет, только если операция имеет идемпотентную семантику/ключ.
- Что выбрать для reactive chain?
WebClient. - Почему client должен быть настроенным bean? Чтобы единообразно управлять transport, timeout, observability и ресурсами.
Связано: HTTP протокол, REST, WebClient, Кейс сетевой N plus 1.