middle
Какие HTTP-клиенты используются в Spring в 2026 году?
RestClient — рекомендованный HTTP-клиент для синхронных Spring-приложений, пришедший на замену RestTemplate. Он сочетает fluent API и синхронную модель выполнения.
Эволюция HTTP-клиентов
| Клиент | Версия | Тип | Статус в 2026 |
|---|---|---|---|
| RestTemplate | Spring 3.0 (2009) | Синхронный, шаблонный | Maintenance |
| WebClient | Spring 5.0 (2017) | Реактивный / блокирующий | Для реактивных приложений |
| RestClient | Spring 6.1 (2023) | Синхронный, fluent API | Рекомендован |
| HTTP Interface | Spring 6.0 (2022) | Декларативный (как Feign) | Набирает популярность |
RestClient — конфигурация и использование
Пример RestClient
@Configuration
public class HttpClientConfig {
@Bean
public RestClient paymentRestClient(RestClient.Builder builder) {
return builder
.baseUrl("https://payment-service.internal")
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.requestInterceptor((request, body, execution) -> {
request.getHeaders().set("X-Trace-Id", MDC.get("traceId"));
return execution.execute(request, body);
})
.defaultStatusHandler(
HttpStatusCode::is5xxServerError,
(request, response) -> {
throw new PaymentServiceUnavailableException(
"Payment service returned " + response.getStatusCode());
})
.build();
}
}
@Component
public class PaymentGatewayAdapter implements PaymentGateway {
private final RestClient restClient;
public PaymentResult charge(UUID orderId, Money amount) {
return restClient.post()
.uri("/api/v1/charges")
.body(new ChargeRequest(orderId, amount.value(), amount.currency()))
.retrieve()
.body(PaymentResult.class);
}
}
Декларативный HTTP Interface
HTTP Interface работает аналогично Feign, но на базе RestClient:
Пример
public interface PaymentServiceClient {
@PostExchange("/api/v1/charges")
PaymentResult charge(@RequestBody ChargeRequest request);
@GetExchange("/api/v1/charges/{id}/status")
PaymentStatus getStatus(@PathVariable UUID id);
}
Частые ошибки
- Использование RestTemplate в новых проектах — он в режиме maintenance
- Отсутствие обработки ошибок и таймаутов в HTTP-клиенте
- Отсутствие передачи trace ID между сервисами
На собеседовании: ключевой вопрос: “Чем RestClient отличается от WebClient?” RestClient — синхронный fluent API, WebClient — реактивный. С Virtual Threads RestClient даёт ту же масштабируемость, что и WebClient, но с простым синхронным кодом. Упоминание HTTP Interface как декларативной альтернативы Feign покажет, что вы следите за экосистемой.