WebClient

Тема дорожной карты · Spring Boot

WebClient — это реактивный, неблокирующий HTTP-клиент, представленный в Spring WebFlux и доступный в каждом Spring Boot-приложении как замена устаревшего RestTemplate, разработанный для создания компонуемых и back-pressure-aware синхронных и асинхронных исходящих HTTP-вызовов. Он создаётся через WebClient.builder().baseUrl("https://api.example.com").defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token).build(), а каждый запрос выражается как fluent-цепочка — .get().uri("/users/{id}", userId).retrieve().bodyToMono(UserResponse.class) — возвращающая Mono<T> или Flux<T> из Project Reactor без блокирования потока. WebClient интегрируется с поддержкой клиента OAuth2 Spring Security через ServerOAuth2AuthorizedClientExchangeFilterFunction, прозрачно прикрепляя и обновляя Bearer-токены для вызовов сервис-к-сервису в микросервисных архитектурах, и участвует в инструментировании Micrometer, так что задержки исходящих запросов автоматически отображаются в дашбордах Prometheus и Grafana. При использовании с .block() WebClient может обслуживать синхронные сценарии внутри Spring MVC-приложений без реактивного стека, хотя предпочтительным паттерном является распространение Mono и Flux от @RestController до нижестоящего вызова и обратно. WebClient — стандартный HTTP-клиент для Spring Boot-микросервисов, развёрнутых в Kubernetes, где паттерны устойчивости — повторные попытки с retryWhen(Retry.backoff(...)) и таймауты с .timeout(Duration.ofSeconds(3)) — являются первоклассными реактивными операторами, а не потокоблокирующими вызовами-обёртками.

Как это работает

WebClient: Spring WebFlux — non-blocking reactive стек на Project Reactor (типы Mono + Flux). Вместо one thread per request (Servlet), маленький thread pool handle-ит много concurrent запросов через event loop. R2DBC — reactive DB driver, аналог JDBC. WebClient (non-blocking, reactive HTTP-клиент) заменяет RestTemplate. Reactive код читается иначе: цепочки операторов (map, flatMap, filter) вместо imperative. Big learning curve, реальная польза только на high concurrency.

Когда применять

WebFlux только когда (а) huge fan-out + нужен backpressure, (б) streaming, (в) downstream reactive end-to-end. Смешение blocking JDBC в reactive-флоу убивает суть (offloading осторожно). Для типичного CRUD MVC + Servlet проще, debuggable, достаточно быстро. Virtual threads (JDK 21+) закрывают gap для многих случаев — рассмотрите до WebFlux.

Типичные ошибки

Ловушки WebClient: blocking calls внутри reactive-цепочек (убивает модель + deadlocks); reactive везде "потому что быстрее" (медленнее для wrong shape работы); сложнее debugging (stack traces бесполезны; checkpoint() + reactor debug agent); over-use flatMap, когда map работает.

Связанные понятия

Полезные ресурсы