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.

Вопросы для повторения

  1. RestTemplate неблокирующий? Нет.
  2. Какие timeout нужны? Как минимум соединения и ожидания ответа; также важна очередь пула.
  3. Можно ли retry любого POST? Нет, только если операция имеет идемпотентную семантику/ключ.
  4. Что выбрать для reactive chain? WebClient.
  5. Почему client должен быть настроенным bean? Чтобы единообразно управлять transport, timeout, observability и ресурсами.

Связано: HTTP протокол, REST, WebClient, Кейс сетевой N plus 1.