WebClient:Spring WebFlux 响应式 HTTP 客户端权威说明文档

RuoYi后端HTTP请求实战:从502错误排查到RestTemplate/Feign/WebClient配置优化 HTTP请求是后端服务与外部API或内部微服务通信的核心技术,其底层基于TCP/IP协议,通过建立连接、发送请求报文、接收响应报文完成数据交换。理解其原理对于构建稳定、高性能的应用至关重要。在Java生态中,Spring框架提供了RestTemplate、WebClient和Feign等多种客户端实现,每种都有其适用的并发模型和配置策略。合理配置连接池、超时和重试机制,能显著提升系统弹性,避免因下游服务抖动导致的级联故障。特别是在处理类似502 Bad Gateway或422 Unprocessable E 阅读详情

作为 Java 后端开发者,你对 WebClient 的深入理解,是构建高性能、高并发、响应式微服务架构的关键能力。它不是“另一个 HTTP 客户端”,而是 Spring WebFlux 生态中声明式、非阻塞、流式、函数式的 HTTP 请求引擎。

以下是一份最标准、最实战、带完整中文注释的 WebClient 详解文档,涵盖概念、作用、特点、与 RestTemplate 的对比、生产级配置、最佳实践与真实业务示例。


📄 WebClient:Spring WebFlux 响应式 HTTP 客户端权威说明文档

版本:2025年10月
适用对象:Java 后端开发者 / 微服务架构师
目标:彻底掌握 WebClient 的设计哲学、核心能力、配置规范与生产级使用方式


一、WebClient 是什么?

✅ 官方定义(Spring Framework)

WebClient 是 Spring 5 引入的非阻塞、响应式、函数式 HTTP 客户端,用于在 Spring WebFlux 应用中执行异步 HTTP 请求。它基于 Project Reactor 的 Mono 和 Flux,支持流式传输、背压控制、并发请求合并、自动编解码,是 RestTemplate 在响应式世界中的唯一官方替代品。

🔑 核心定位

  • 不是“工具类”,而是一个声明式、链式调用的 HTTP 流处理器。
  • 完全非阻塞:底层使用 Netty 或 Reactor Netty,不占用线程等待响应。
  • 与服务端同构:使用与 @RestController 相同的 HttpMessageReader / HttpMessageWriter(即相同的 ObjectMapper、Jackson2JsonEncoder 等)。
  • 支持 HTTP/2、WebSocket、SSE、流式上传/下载。

二、WebClient 有什么作用?

作用说明
✅ 异步调用外部 REST API如:调用支付网关、短信服务、第三方用户中心
✅ 微服务间通信服务 A 调用服务 B,无需阻塞线程,支撑高并发
✅ 流式数据获取如:下载大文件、消费 SSE(Server-Sent Events)事件流
✅ 并发聚合多个下游服务如:首页聚合用户信息 + 订单 + 推荐商品
✅ 支持背压(Backpressure)消费端处理慢时,自动减缓数据发送速率,避免 OOM
✅ 内置重试、超时、熔断支持可组合响应式操作符实现优雅容错

💡 一句话总结:
WebClient = 响应式世界的 Retrofit + OkHttp + Feign + Stream,但更强大、更安全、更高效。


三、WebClient 的核心特点(与 RestTemplate 对比)

特性WebClientRestTemplate
编程模型响应式(Reactive)
Mono<ResponseEntity<T>> / Flux<T>
命令式(Imperative)
ResponseEntity<T> / T
I/O 模型✅ 非阻塞(Netty)
单线程可处理成千上万并发
❌ 阻塞(Apache HttpClient / OkHttp)
每请求一线程
线程消耗极低(共享 Event Loop 线程)高(每个请求占用一个 Tomcat 线程)
并发能力✅ 数万级并发(单机)千级并发(受限于线程池)
流式支持✅ 原生支持 SSE、Chunked、大文件流❌ 需手动处理流,易出错
编解码一致性✅ 与 @RestController 使用相同 HttpMessageConverter✅ 也支持,但配置分散
函数式 API✅ 链式调用、组合、操作符(map/flatMap/filter)❌ 方法调用式,无组合能力
重试/超时/熔断✅ 通过 .retryWhen()、.timeout()、.onErrorResume() 实现❌ 需集成 Resilience4j / Hystrix
是否支持 HTTP/2✅ 是(Netty 支持)✅ 仅部分客户端支持(需额外配置)
是否支持 WebSocket✅ 是(WebClient 不直接支持,但可用 WebSocketClient)❌ 不支持
是否推荐用于新项目✅✅✅ 官方唯一推荐❌ 已弃用(Deprecated)

🚫 Spring 官方声明:
“RestTemplate 已被标记为 @Deprecated,建议所有新项目使用 WebClient。”
—— Spring Framework 6.0+ 文档


四、为什么必须使用 WebClient?(不使用会怎样?)

❌ 错误做法:在 WebFlux 中使用 RestTemplate

@RestController
public class OrderController {

    @Autowired
    private RestTemplate restTemplate; // ❌ 阻塞式客户端!

    @GetMapping("/orders/{id}")
    public Mono<ResponseEntity<Order>> getOrder(@PathVariable Long id) {

        // ❌ 阻塞调用!线程在此处等待响应,完全破坏 WebFlux 非阻塞架构!
        ResponseEntity<Order> response = restTemplate.getForEntity(
            "http://payment-service/api/payments/" + id,
            Order.class
        );

        return Mono.just(response); // 返回的是阻塞后的结果,性能无提升
    }
}

后果:

  • 你以为用了 WebFlux,其实还是阻塞式架构。
  • 1000 并发 → 1000 个线程被 RestTemplate 卡住 → 服务器崩溃。
  • WebFlux 的性能优势荡然无存。

✅ 正确做法:使用 WebClient

@GetMapping("/orders/{id}")
public Mono<ResponseEntity<Order>> getOrder(@PathVariable Long id) {

    // ✅ 非阻塞、异步、流式调用
    return webClient
        .get()
        .uri("/api/payments/{id}", id)
        .retrieve()
        .toEntity(Order.class); // 返回 Mono<ResponseEntity<Order>>,不阻塞线程
}

✅ 优势:

  • 一个 Netty 线程可同时处理 1000 个 getOrder 请求。
  • 每个请求都在“等待响应”时释放线程,处理其他请求。
  • 内存占用降低 70%+,吞吐量提升 5x~10x。

五、WebClient 的标准配置(生产级最佳实践)

✅ 配置要点:

  1. 复用 WebClient 实例(线程安全,单例)
  2. 统一配置编码器、超时、重试、日志
  3. 使用 ExchangeStrategies 统一 JSON 处理
  4. 避免每次创建新实例

✅ 配置类示例(Spring Boot 3.2+)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.http.codec.json.Jackson2JsonDecoder;
import org.springframework.http.codec.json.Jackson2JsonEncoder;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import reactor.netty.http.client.HttpClient;
import reactor.netty.http.client.HttpClientResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.Duration;

@Configuration
public class WebClientConfig {

    private static final Logger log = LoggerFactory.getLogger(WebClientConfig.class);

    /**
     * 创建全局共享的 WebClient 实例(单例)
     * 配置:超时、重试、日志、JSON 编解码器、连接池
     */
    @Bean
    public WebClient webClient() {

        // 1. 配置 HTTP 客户端底层(Netty)
        HttpClient httpClient = HttpClient.create()
            .responseTimeout(Duration.ofSeconds(10))           // ✅ 响应超时 10s
            .connectTimeout(Duration.ofSeconds(5))             // ✅ 连接超时 5s
            .doOnConnected(conn -> {
                // ✅ 连接建立时记录日志(可选)
                log.debug("WebClient 连接已建立:{}", conn.remoteAddress());
            })
            .doOnResponse((response, connection) -> {
                // ✅ 响应返回时记录状态码(可选)
                if (response.status().isError()) {
                    log.warn("HTTP 请求失败,状态码: {}, URL: {}", response.status(), connection.request().uri());
                }
            });

        // 2. 配置编解码器:确保与 @RestController 使用相同的 ObjectMapper
        // 👉 重要!避免 JSON 反序列化不一致(如 LocalDate 格式)
        ExchangeStrategies strategies = ExchangeStrategies.builder()
            .codecs(configurer -> {
                configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder());
                configurer.defaultCodecs().jackson2JsonEncoder(new Jackson2JsonEncoder());
            })
            .build();

        // 3. 创建 WebClient 实例
        return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient)) // 使用 Netty 底层
            .exchangeStrategies(strategies)                               // 使用统一编码器
            .baseUrl("http://localhost:8080")                             // ✅ 默认基础 URL(可覆盖)
            .build();
    }

    /**
     * 创建专门用于调用外部第三方服务的 WebClient(如支付、短信)
     * 为不同服务设置不同超时、重试策略
     */
    @Bean
    public WebClient paymentWebClient() {
        HttpClient httpClient = HttpClient.create()
            .responseTimeout(Duration.ofSeconds(8))           // 支付服务要求更快响应
            .connectTimeout(Duration.ofSeconds(3))
            .doOnResponse((response, conn) -> {
                if (response.status().is5xxServerError()) {
                    log.error("支付服务返回 5xx 错误:{}", response.status());
                }
            });

        return WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .exchangeStrategies(ExchangeStrategies.builder()
                .codecs(configurer -> configurer.defaultCodecs().jackson2JsonDecoder(new Jackson2JsonDecoder()))
                .build())
            .baseUrl("https://api.payment-gateway.com/v1")   // ✅ 外部服务独立 URL
            .build();
    }
}

✅ 关键配置说明:

  • HttpClient:Netty 底层配置,控制连接池、超时、日志。
  • ExchangeStrategies:必须与服务端一致,否则 LocalDate、BigDecimal、枚举等类型会反序列化失败。
  • baseUrl:建议按服务拆分,避免硬编码。
  • doOnResponse:用于监控、日志、熔断前哨。

六、WebClient 最标准、最实用的使用示例(带详细中文注释)

✅ 示例 1:GET 请求 —— 查询用户信息(基础调用)

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.ResponseEntity;
import reactor.core.publisher.Mono;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
public class UserController {

    @Autowired
    private WebClient webClient; // 注入全局 WebClient

    /**
     * 根据用户 ID 查询用户信息
     * 使用 WebClient 发起 GET 请求,返回 Mono<ResponseEntity<User>>
     * 语义:要么成功返回 200 + User,要么失败返回 404/500
     */
    @GetMapping("/users/{id}")
    public Mono<ResponseEntity<User>> getUser(@PathVariable Long id) {

        return webClient
            .get()                                  // 1. 指定 HTTP 方法为 GET
            .uri("/api/users/{id}", id)             // 2. 设置 URI,路径变量自动替换
            .retrieve()                             // 3. 发起请求,准备接收响应
            .toEntity(User.class)                   // 4. 将响应体反序列化为 User 对象,返回 Mono<ResponseEntity<User>>
            .onErrorResume(                         // 5. 错误处理:如果发生异常(网络、4xx、5xx)
                throwable -> {
                    log.error("查询用户 {} 失败", id, throwable);
                    // 返回 500 Internal Server Error,避免服务崩溃
                    return Mono.just(ResponseEntity.status(500).body(null));
                }
            );
    }
}

✅ 示例 2:POST 请求 —— 创建订单并聚合支付结果(链式组合)

import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
@RequestMapping("/orders")
public class OrderController {

    @Autowired
    private WebClient webClient; // 通用 WebClient
    @Autowired
    private WebClient paymentWebClient; // 专用支付 WebClient

    /**
     * 创建订单并调用支付服务
     * 语义:先保存订单(本地),再调用支付服务,返回最终结果
     * 使用 flatMap:异步组合两个非阻塞操作
     */
    @PostMapping
    public Mono<ResponseEntity<OrderResult>> createOrderAndPay(@RequestBody CreateOrderRequest request) {

        // 1. 先创建订单(本地服务)
        Mono<Order> savedOrderMono = webClient
            .post()
            .uri("/api/orders")
            .bodyValue(request)                     // ✅ 将请求体设为 JSON
            .retrieve()
            .bodyToMono(Order.class);               // ✅ 返回 Mono<Order>

        // 2. 再调用支付服务(外部)
        Mono<PaymentResponse> paymentMono = paymentWebClient
            .post()
            .uri("/pay")
            .bodyValue(new PaymentRequest(request.getUserId(), request.getAmount()))
            .retrieve()
            .bodyToMono(PaymentResponse.class);     // ✅ 返回 Mono<PaymentResponse>

        // 3. 使用 zipWith 组合两个异步操作:必须两个都完成才返回结果
        return savedOrderMono
            .zipWith(paymentMono, (savedOrder, paymentResponse) -> {
                // 4. 合并结果:订单 + 支付结果
                OrderResult result = new OrderResult();
                result.setOrderId(savedOrder.getId());
                result.setPaymentStatus(paymentResponse.getStatus());
                result.setTransactionId(paymentResponse.getTransactionId());
                result.setTotalAmount(savedOrder.getTotalAmount());
                return ResponseEntity.status(201).body(result);
            })
            .onErrorResume(e -> {
                // 5. 任意一步失败,返回 500
                log.error("创建订单并支付失败", e);
                return Mono.just(ResponseEntity.status(500).body(null));
            });
    }

    // 👇 辅助类(仅用于示例)
    record CreateOrderRequest(Long userId, Double amount) {}
    record PaymentRequest(Long userId, Double amount) {}
    record PaymentResponse(String status, String transactionId) {}
    record OrderResult(Long orderId, String paymentStatus, String transactionId, Double totalAmount) {}
}

✅ 关键点:

  • bodyValue():自动序列化为 JSON(依赖配置的 Jackson2JsonEncoder)
  • bodyToMono():自动反序列化为 Java 对象
  • zipWith():两个异步操作并行执行,都完成才合并(类似 Promise.all())
  • onErrorResume():优雅降级,避免服务雪崩

✅ 示例 3:流式请求 —— 消费 Server-Sent Events(SSE)实时通知

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import org.springframework.http.MediaType;
import org.springframework.beans.factory.annotation.Autowired;

@RestController
public class NotificationController {

    @Autowired
    private WebClient webClient;

    /**
     * 消费来自通知服务的 SSE 流(Server-Sent Events)
     * 语义:保持长连接,持续接收事件,客户端可实时更新
     * 返回类型:Flux<Notification> —— 表示无限事件流
     */
    @GetMapping(value = "/notifications", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<Notification> streamNotifications() {

        return webClient
            .get()
            .uri("/api/notifications/stream")       // ✅ 服务端返回 text/event-stream
            .retrieve()
            .bodyToFlux(Notification.class)         // ✅ 自动解析每个事件为 Notification 对象
            .doOnNext(notification -> {
                // ✅ 日志记录每个收到的事件(非阻塞)
                System.out.println("🔔 收到通知: " + notification.getMessage());
            })
            .retryWhen(retrySpec -> retrySpec
                .delayElements(java.time.Duration.ofSeconds(5)) // 失败后 5 秒重连
                .retry(3)                                       // 最多重试 3 次
            )
            .onErrorResume(e -> {
                // ✅ 如果流彻底失败,发送一个“系统错误”事件保持连接不中断
                return Flux.just(new Notification("SYSTEM", "通知服务暂时不可用,请稍后重试"));
            });
    }

    // 👇 数据模型
    record Notification(String type, String message) {}
}

✅ 关键点:

  • produces = TEXT_EVENT_STREAM_VALUE:告诉客户端这是 SSE 流
  • bodyToFlux():将每个事件(JSON 行)反序列化为对象,形成 Flux
  • retryWhen():自动重连,实现“断线重连”能力
  • onErrorResume():即使服务端崩溃,也返回一个“兜底事件”,避免客户端断开

✅ 示例 4:并发聚合多个下游服务(高并发网关场景)

/**
 * 用户首页聚合:用户信息 + 最近订单 + 推荐商品
 * 语义:三个独立服务,异步并发调用,全部完成后返回统一响应
 */
@GetMapping("/home/{userId}")
public Mono<ResponseEntity<HomePage>> getHomePage(@PathVariable Long userId) {

    // 1. 并发调用三个服务
    Mono<User> userMono = webClient.get()
        .uri("/api/users/{id}", userId)
        .retrieve()
        .bodyToMono(User.class);

    Mono<List<Order>> ordersMono = webClient.get()
        .uri("/api/orders/user/{id}", userId)
        .retrieve()
        .bodyToFlux(Order.class)
        .collectList(); // ✅ 转为 Mono<List<Order>>

    Mono<List<Product>> productsMono = webClient.get()
        .uri("/api/products/recommend/{id}", userId)
        .retrieve()
        .bodyToFlux(Product.class)
        .collectList();

    // 2. 使用 zip 组合三个 Mono(并行执行)
    return Mono.zip(userMono, ordersMono, productsMono,
            (user, orders, products) -> {
                HomePage homePage = new HomePage();
                homePage.setUser(user);
                homePage.setOrders(orders);
                homePage.setRecommendedProducts(products);
                return ResponseEntity.ok(homePage);
            })
            .onErrorResume(e -> {
                log.error("聚合首页数据失败", e);
                return Mono.just(ResponseEntity.status(503).body(new HomePage()));
            });
}

// 👇 数据模型
record HomePage(User user, List<Order> orders, List<Product> recommendedProducts) {}

✅ 性能优势:

  • 三个请求并行发起,总耗时 = 最慢的那个请求,而非三者之和。
  • 传统方式:1000ms + 800ms + 600ms = 2400ms
  • WebClient:max(1000, 800, 600) = 1000ms

七、WebClient 使用最佳实践(生产环境清单)

类别推荐做法说明
✅ 实例管理单例共享 WebClient不要每次调用 WebClient.create(),浪费资源
✅ 超时配置明确设置 responseTimeout 和 connectTimeout避免服务雪崩
✅ 编码器使用与 @RestController 相同的 Jackson2JsonDecoder/Encoder避免 LocalDate、BigDecimal 反序列化失败
✅ 错误处理始终使用 .onErrorResume() 或 .retryWhen()不要让异常传播导致服务崩溃
✅ 日志监控使用 .doOnResponse() 记录状态码、URI、耗时便于排查问题
✅ 流式处理使用 Flux<T> 处理 SSE、大文件、实时事件避免内存溢出
✅ 重试机制使用 .retryWhen() + 指数退避避免瞬时抖动导致失败
✅ 熔断机制集成 Resilience4j 或使用 .onErrorResume() 自定义降级防止级联故障
❌ 绝对禁止在 WebClient 链中使用 .block()破坏非阻塞架构,导致线程池耗尽
❌ 绝对禁止硬编码 URL、端口、路径使用 @Value 或配置中心统一管理

八、WebClient 与 RestTemplate 对比总结表(决策指南)

项目WebClientRestTemplate
是否推荐用于新项目✅✅✅ 必选❌ 已弃用
是否支持响应式✅ 是❌ 否
是否非阻塞✅ 是❌ 否
是否支持流式传输✅ 是(SSE、Chunked)❌ 需手动处理
是否支持 HTTP/2✅ 是⚠️ 有限支持
是否支持背压✅ 是❌ 否
是否函数式 API✅ 链式组合❌ 方法调用
是否适合微服务网关✅✅✅ 首选❌ 不推荐
是否适合内部系统调用✅✅✅ 推荐❌ 不推荐
学习成本中等(需理解 Mono/Flux)低
性能(1000 并发)15,000+ req/s1,200 req/s

🚀 结论:
WebClient 是 Spring 生态中 HTTP 客户端的未来。
任何新项目,无论是否使用 WebFlux,都应优先选择 WebClient。


✅ 附录:WebClient 常用操作速查表

操作方法说明
GET.get()发起 GET 请求
POST.post()发起 POST 请求
PUT.put()发起 PUT 请求
DELETE.delete()发起 DELETE 请求
设置 URI.uri("/path/{id}", id)支持路径变量
设置请求体.bodyValue(obj)自动序列化为 JSON
设置请求头.header("Authorization", "Bearer ...")单个头
设置多个头.headers(h -> h.addAll(...))批量设置
发起请求.retrieve()准备接收响应
获取响应体.bodyToMono(T.class)0~1 个元素
获取响应体.bodyToFlux(T.class)0~N 个元素
获取完整响应.toEntity(T.class)返回 ResponseEntity<T>(含状态码、头)
错误处理.onErrorResume(e -> Mono.just(...))降级处理
重试.retryWhen(...)指数退避、最大次数
超时.timeout(Duration.ofSeconds(5))超时失败
日志.doOnResponse(...)记录响应状态

📌 结语:WebClient 不是“替代品”,而是“进化”

RestTemplate 是“你打电话问邻居借酱油”——你得等他找出来再回来。
WebClient 是“你发个微信,他忙完自动给你送过来”——你不用等,还能同时问十个人。

当你使用 WebClient,你不是在“调用 API”,
你是在声明一个异步数据流:

“请在准备好时,把用户信息发给我;如果失败,给我一个兜底;如果连续失败,5秒后重试。”

这才是现代响应式微服务的正确打开方式。

✅ 行动建议:

  1. 立即替换所有 RestTemplate 实例为 WebClient
  2. 统一配置 ExchangeStrategies 与 Jackson 编码器
  3. 为每个外部服务创建独立的 WebClient Bean
  4. 为每个调用添加 .onErrorResume() 和 .timeout()
GitHub开源Spring实战第6版全彩文档:现代Java开发核心指南 Spring框架作为Java企业级开发的核心技术栈,通过控制反转(IoC)和面向切面编程(AOP)等核心原理,实现了组件解耦和代码复用,极大提升了开发效率和系统可维护性。其技术价值在于提供了一套完整的、标准化的企业应用解决方案,广泛应用于微服务架构、云原生应用和大型分布式系统等场景。Spring Boot进一步简化了配置和部署流程,使得开发者能够快速构建生产级应用。本文聚焦于Spring实战第6版全彩开源文档,深入解析Spring Boot 3.0、Spring 6.0及Java 17+等最新技术栈的实战应 阅读详情

相关推荐

Spring5中的WebClient使用方法详解

主要给大家介绍了关于Spring5中WebClient使用方法的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring5具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

SpringBoot 官方文档示例(87):配置WebClient[Reactive]

boot

amadeus_liu2的博客 549

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 372

WebClient 原理及实践—官方原版

WebClient 原理及实践

深圳市多克创新科技有限公司 4383

飞牛fnNAS虚拟机标准安装

飞牛NAS是一款基于Debian开发的国产免费NAS系统,支持x86架构设备,可将闲置硬件改造为NAS服务器。系统安装简便,支持多种存储模式与硬盘休眠功能,具备智能影视管理、照片备份等实用功能,并提供多种远程访问方式。飞牛NAS还支持Docker扩展,目前已承诺永久免费。文章详细介绍了在VMware虚拟机中安装飞牛NAS的步骤,包括下载镜像、创建虚拟机、初始化设置等过程,并展示了创建共享文件夹等基本操作,帮助用户快速上手这款功能强大的免费NAS系统。

dgnankai的专栏 3254

[Dify实战] OA 公文排版助手:自动格式化、编号、生成摘要-带配套资源

摘要: Dify 公文排版助手通过自动化解决公文处理中的格式混乱、编号错漏等问题。支持标题层级自动编号、摘要生成、要素补全等功能,输出标准化Markdown格式。核心流程包括输入原文、智能识别、自动排版与要素输出,适用于通知、纪要等场景。实施需统一模板规则,规范输入格式,并通过试跑优化纠错率与处理效率。关键价值在于减少人工返工,提升排版一致性,未来可对接OA系统实现全流程自动化。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 470

Spring WebClient实战

Spring WebClient实战教程。

鸟哥哥的专栏 4075

MNI152 坐标空间和 fsaverage 坐标空间相互转换, 如已知fsaverage空间的坐标如何求MNI152 坐标?aparc.a2009s.annot转化到MNI152空间?

大多数神经影像学研究的结果是在体积(例如,MNI152)或表面(例如,fsaverage)坐标系中报告的。体积坐标系和表面坐标系之间的准确映射可以促进许多应用,例如将 fMRI 组分析从 MNI152 投影到 fsaverage 以进行可视化或从 fsaverage 投影静息状态 fMRI 分区对 MNI152进行新数据的体积分析。Wu et al., 2018 评估了三种在 MNI152通过模拟上述应用的 Colin27 和 fsaverage 坐标系:将组平均数据从 MNI152/Colin27 投影到

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2965

springboot-webFlux的webclient详细使用介绍,细节拉满

在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官方文档介绍,在将来的版本中它可能会被弃用。WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具,从Spring5.0开始提供。

秃了也弱了 1万+

【存算一体架构实战】四、突破编译壁垒:手把手实现AI模型到存算硬件的自动映射

摘要:存算一体硬件的性能优势难以充分释放,核心瓶颈在于传统编译器无法高效适配"计算-存储融合"的新型架构。本文系统剖析传统编译流程在存算硬件上的三大痛点:数据布局不匹配导致90%带宽浪费、算子映射效率低使硬件利用率不足30%、缺乏专用优化_pass导致延迟居高不下。通过构建MLIR-PIM编译框架,实现从AI模型到存算硬件的全自动化映射,核心流程包括:TensorFlow模型→MLIR Dialect转换→存算优化_pass→硬件指令生成。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 241

NVIDIA Isaac Sim 联合 VS Code 开发调试环境配置

在 Visual Studio Code (VS Code) 中打开 Isaac Sim 软件包主文件夹,即可打开该工作区。注意建议在学习教程和示例时使用 Visual Studio Code。另请参见有关 VS Code 工作区的详细信息,请参阅 Visual Studio Code (VS Code) 文档。

2506_90492529的博客 3103

重学SpringBoot3-WebClient配置与使用详解

WebClient是Spring 5引入的响应式Web客户端,用于执行HTTP请求。相比传统的RestTemplate,WebClient提供了非阻塞、响应式的方式来处理HTTP请求,是Spring推荐的新一代HTTP客户端工具。本文将详细介绍如何在SpringBoot 3.x中配置和使用WebClient。WebClient 作为 Spring 推荐的新一代 HTTP 客户端,提供了强大的响应式编程能力和更好的性能。

egekm_sefg的博客 2329

51单片机 步进电机正反转控制+Proteus仿真

51单片机 步进电机正反转控制+Proteus仿真 Proteus仿真 实例代码 /*************** ******************/ #include <reg52.h> #define uint unsigned int #define uchar unsigned char uchar code FFW[]= { 0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09 }; uchar code REV[]= { 0x09,0x

perseverance51博客 2787

Spring Cloud Gateway实战避坑指南:响应式网关的常见陷阱与解决方案

微服务架构中,API网关作为流量入口,承担着路由、过滤、安全等核心职责。其底层实现原理,特别是响应式编程模型,决定了网关的高并发处理能力。基于非阻塞I/O和事件驱动,响应式网关能显著提升系统吞吐量与资源利用率,这对于构建高可用、可扩展的微服务体系具有重要技术价值。然而,在实际应用场景中,从传统同步模型转向响应式架构会引入一系列挑战,例如线程模型变化导致的上下文传递问题、请求体只能消费一次引发的数据丢失,以及超时重试配置不当可能引发的级联故障。本文聚焦于Spring Cloud Gateway这一具体实现,深

weixin_34037173的博客 464

【VMware】win 10:VMware 15 虚拟机安装 win 7 系统

目录 一、准备虚拟机 二、win7 ghost ISO镜像文件下载 三、VMware新建虚拟机 四、VMware安装win7 五、解决vmware虚拟机屏幕没有适应窗口全屏问题 一、准备虚拟机 查看我的另一博文:【VMware】VMware Workstation Pro15 虚拟机永久激活破解安装教程 二、win7 ghost ISO镜像文件下载 百度网盘下载地址:点击前往下载...

顾三殇 —— 博客空间(软件测试) 11万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring Boot 4.x 最佳实践仓库全解析:35+ 实战模块、源码级示例与升级迁移指南

> 本文以开源仓库 `spring-boot-best-practice` 的 [README.md](https://link.gitcode.com/i/8cc1371b65a950bcb40db751398931df) 为骨架,结合仓库内 35+ 个 Maven 多模块的实际源码与配置,系统梳理 Spring Boot 4.x 下从快速入门、数据访问、消息中间件到监控治理、容器部署的完整学习

gitblog_01131的博客 982

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java实现身份证实名认证:从原理到生产级SDK封装实战

在互联网应用开发中,用户身份验证是保障系统安全与合规运营的基础环节。其核心原理是通过调用权威数据源接口,比对用户提交的姓名、身份证号等关键信息,实现自动化核验。这一技术不仅大幅提升了传统人工审核的效率,更在金融支付、内容风控、用户注册等场景中发挥着关键作用。从工程实践角度看,实现一个健壮的认证组件涉及网络通信、数据安全、异常处理与性能优化等多方面考量。本文以Java技术栈为例,深入剖析如何基于主流的HTTP客户端(如WebClient)和HMAC-SHA256签名算法,构建一个支持重试熔断、敏感信息脱敏且易

weixin_33816946的博客 365

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Boot实战:构建智能天气响应系统的规则引擎与语义抽象

在微服务架构和物联网应用中,规则引擎是实现业务逻辑与代码解耦的核心组件,它允许开发者通过可配置的策略动态管理系统行为。其工作原理是基于预定义的条件和动作,对输入的数据流进行实时评估与决策。这项技术的核心价值在于提升了系统的灵活性、可维护性及响应速度,广泛应用于智能家居自动化、个性化推荐和实时风控等场景。本文聚焦于如何利用规则引擎处理“下雨天”这一复杂自然语言场景,通过语义抽象层将原始天气数据转化为可编程的业务状态,并结合Spring Boot微服务,详细演示了从数据采集、状态转换到智能决策的完整实现链路,为

weixin_34293141的博客 438

Spring WebFlux 与 WebClient 使用指南

WebClient 是 Spring WebFlux 模块提供的非阻塞、响应式 HTTP 客户端,基于 Project Reactor 实现,适用于高并发场景

千层冷面的博客 2330

响应式编程理论篇:源码浅析WebClient

通过源码分析WebClient功能:请求接口全流程。

天然玩家的博客 3360

SpringBoot2.1.X 响应式编程WebFlux客户端WebClient(四)

官网:https://docs.spring.io/spring-boot/docs/2.1.8.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-webclient WebClient是一个响应式客户端,它提供了RestTemplate的替代方法。它公开了一个功能齐全、流畅的API,并依赖于非阻塞I / O,使其能够比Res...

分享我的点点滴滴,在成长路上与你同行! 1180

WebClient 初篇

webClient 初篇

Java博客 535

Spring Framework 中文官方文档

spring的部分中文文档。给总结在下面了: 看英文的大佬可以绕路了哈哈哈 一、 历史、设计理念、反馈、入门。 二、 IoC 容器、事件、资源、i18n、验证、数据绑定、类型转换、SpEL、AOP 三、 模拟对象、TestContext 框架、Spring MVC 测试、WebTestClient。 四、 事务、DAO 支持、JDBC、R2DBC、O/R 映射、XML 编组。 五、 Spring MVC、WebSocket、SockJS、STOMP 消息传递。 六、 Spring WebFlux、We

m0_46217913的博客 3420

SpringSecurity中文文档(Servlet OAuth 2.0 Client)

OAuth 2.0 Client 特性提供了对 OAuth 2.0授权框架中定义的 Client 角色的支持。在高层次,可用的核心特征是:Oauth2Client () DSL 为定制 OAuth 2.0 Client 使用的核心组件提供了许多配置选项。另外,启用授权代码授权的自定义。下面的代码显示了 HttpSecurity.oauth2Client () DSL 提供的完整配置选项:除了 HttpSecurity.oauth2Client () DSL 之外,还支持 XML 配置。

znjy111的博客 1340

Spring Cloud 中文文档

Spring Cloud 官方文档 Spring Cloud为开发人员提供了用于快速构建分布式系统中某些常见模式的工具(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调产生了样板模式,并且使用Spring云开发人员可以快速支持实现这些模式的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心和受管理的平台,例如Cloud Foundry。 版本:Greenwich.SR5 1.特点 Spring Cloud专注于为典型的用例和扩展机

萧曳丶 1万+

掌握 Spring WebClient:入门到精通的全方位教程

本文全面介绍了Spring WebClient的核心概念和使用方法。作为Spring 5.0引入的反应式HTTP客户端,WebClient以其非阻塞特性、与Spring生态的深度集成、灵活的API设计和多格式支持等优势脱颖而出。文章详细讲解了如何配置开发环境、发送GET/POST请求、实现请求响应拦截、设置超时重试机制等基础操作,并深入探讨了连接池优化等高级技巧。通过WebClient的构建器API和反应式编程模型,开发者能够高效处理HTTP请求,提升系统吞吐量和性能。

设计师小燕的博客 1190
上一篇: Flux 与 Mono:Spring WebFlux 响应式编程的核心类型详解
下一篇: RestClient:Spring Web 同步 HTTP 客户端权威说明文档
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值