Вопрос с собеседования · Spring

Как вызывать внешние HTTP-сервисы из Spring — RestClient и WebClient?

MiddleReactive и WebFlux
Ещё спрашивают так:
  • Чем WebClient отличается от RestTemplate?
  • Как задать таймауты HTTP-клиенту в Spring?
Коротко

RestClient (Spring 6.1) — современный синхронный клиент с fluent API, замена RestTemplate для блокирующих приложений. WebClient — неблокирующий клиент на Reactor, возвращает Mono и Flux; нужен в WebFlux и для параллельных вызовов. Обязательны таймауты (соединение и ответ), обработка статусов (onStatus), повторы только идемпотентных запросов с паузой, общий настроенный бин клиента вместо создания на каждый вызов.

  • retrieve().bodyToMono(...) — тело ответа; ошибки 4xx/5xx становятся исключениями
  • Параллельные вызовы в WebClient — Mono.zip
  • В блокирующем коде WebClient с block() — допустимо, но RestClient проще

А ещё Без таймаута медленный внешний сервис исчерпывает потоки или соединения вашего

Подробно

var client = WebClient.builder()
    .baseUrl("https://api.partner.ru")
    .clientConnector(new ReactorClientHttpConnector(
        HttpClient.create().responseTimeout(Duration.ofSeconds(3))))
    .build();

Mono<Price> price = client.get().uri("/prices/{id}", id)
    .retrieve()
    .onStatus(HttpStatusCode::is4xxClientError,
              r -> Mono.error(new PriceNotFound(id)))
    .bodyToMono(Price.class)
    .retryWhen(Retry.backoff(2, Duration.ofMillis(200)));

Mono.zip(price, stockMono).map(t -> combine(t.getT1(), t.getT2()));

Что хотят услышать

  • RestClient для синхронного, WebClient для реактивного.
  • Таймауты и обработка статусов.
  • Повторы и параллельные вызовы.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓RestClient — синхронный, WebClient — неблокирующий на Mono/Flux; обоим нужны таймауты
  • ✗WebClient — синхронный клиент, RestClient — реактивный, поэтому таймауты задают только первому
  • ✗Новый клиент создают на каждый запрос, чтобы не делить пул соединений между потоками
  • ✗Таймауты HTTP-клиенту задавать не нужно — сервер всегда отвечает

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования