李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 左邻右舍
  • 博友圈
  • 关于我
    • 关于我
    • 另一个网站
    • 我的导航站
    • 网站地图
    • 赞助
  • 留言
  • 走心评论
  • 系列文章
  • Now
  • 每日心情
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

Spring HTTP客户端演进:从RestTemplate到WebClient与RestClient

2025年10月29日 约 1,819 字7 分钟 29点热度 0人点赞 0条评论
本文最后更新于 2025年10月29日,距今已 283 天,其中的信息可能已经发生变化,请注意甄别。

在Spring生态中,HTTP客户端一直是连接服务、集成外部API的核心组件。从早期的RestTemplate到如今的WebClient和RestClient,Spring的HTTP客户端方案不断演进,以适应现代应用架构的需求。本文将深入解析RestTemplate的"退役"之路、新方案的设计理念,并通过实例对比三者的差异,帮助你在项目中做出合适的技术选择。

一、RestTemplate的"退役":不是删除,而是迭代

1. 澄清:"弃用"的真实含义

首先需要明确:Spring从未正式"弃用"(deprecate)RestTemplate,但它已进入"维护模式"(Maintenance Mode)。这意味着:

  • 不再添加新功能,仅修复重大bug和安全漏洞;
  • 官方明确推荐新项目使用WebClient(响应式场景)或RestClient(同步场景)替代;
  • 现有项目中的RestTemplate可继续使用,Spring暂无移除计划(至少短期内不会删除)。

2. 为何RestTemplate会被"边缘化"?

RestTemplate自Spring 3.0(2009年)引入,服务了十多年,但随着分布式架构和高并发场景的普及,其设计局限性逐渐凸显:

  • 阻塞式I/O模型:每个请求独占一个线程直到响应返回,高并发下线程池易耗尽,导致性能瓶颈;
  • 同步编程模型:不支持异步/响应式编程,无法适配Spring WebFlux等响应式生态;
  • API设计陈旧:基于模板方法模式,配置和扩展不够灵活(如拦截器、异常处理较繁琐);
  • 功能局限性:不支持流式处理(如大文件上传下载)、缺乏对HTTP/2的原生支持。

3. 时间线:RestTemplate的"退休计划"

Spring对RestTemplate的态度转变有明确的时间节点:

  • 2017年:Spring 5.0引入WebClient,作为响应式HTTP客户端的替代方案;
  • 2022年:Spring 6.0强化WebClient地位,明确RestTemplate进入维护模式;
  • 2023年:Spring 6.1/3.2引入RestClient,作为RestTemplate的同步替代方案,填补同步场景的现代化需求;
  • 未来规划:RestTemplate将长期保留以保证兼容性,但不会有功能更新。

二、WebClient:响应式时代的HTTP客户端

1. 核心定位

WebClient是Spring WebFlux模块提供的非阻塞、响应式HTTP客户端,基于Netty的NIO模型实现,专为高并发、低延迟场景设计。它是Spring响应式生态(WebFlux、Spring Cloud Gateway等)的核心组件。

2. 关键特性

  • 非阻塞I/O:一个线程可处理多个请求,资源利用率提升10倍以上;
  • 响应式编程:返回Mono(单结果)或Flux(多结果),支持链式操作和背压(Backpressure);
  • 全功能支持:支持GET/POST/PUT/DELETE等所有HTTP方法,以及文件上传下载、表单提交、WebSocket等;
  • 灵活扩展:内置拦截器、过滤器,支持自定义编码/解码,适配各种数据格式(JSON、XML、Protobuf等)。

3. 使用实例

依赖引入(Maven)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

基本配置

@Configuration
public class WebClientConfig {
    @Bean
    public WebClient webClient() {
        return WebClient.builder()
                .baseUrl("https://api.example.com")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .clientConnector(new ReactorClientHttpConnector(
                        HttpClient.create().responseTimeout(Duration.ofSeconds(3))
                ))
                .build();
    }
}

核心操作示例

GET请求(获取单个资源)

// 同步获取(阻塞等待结果)
User user = webClient.get()
        .uri("/users/{id}", 100)
        .retrieve() // 发起请求并处理响应状态(4xx/5xx会抛异常)
        .bodyToMono(User.class) // 解析响应体为User对象
        .block(); // 阻塞获取结果(仅在非响应式环境中使用)

// 异步处理(响应式场景推荐)
webClient.get()
        .uri("/users/{id}", 100)
        .retrieve()
        .bodyToMono(User.class)
        .subscribe(
            user -> log.info("获取用户:{}", user),
            error -> log.error("请求失败", error)
        );

POST请求(提交数据)

Mono<User> createdUser = webClient.post()
        .uri("/users")
        .bodyValue(new User("张三", 25)) // 请求体
        .retrieve()
        .onStatus(HttpStatusCode::is4xxClientError, resp -> 
            Mono.error(new RuntimeException("客户端错误"))
        )
        .bodyToMono(User.class);

三、RestClient:同步场景的现代替代者

1. 核心定位

RestClient是Spring 6.1(2023年)引入的同步HTTP客户端,专为Spring MVC等传统同步场景设计,旨在替代RestTemplate的功能,同时提供更现代的API。

2. 关键特性

  • 同步非阻塞:基于HttpClient(Java 11+)或OkHttp,支持同步调用但底层可优化I/O(非Netty);
  • 流畅API:基于构建者模式,代码可读性比RestTemplate更高;
  • 灵活的响应处理:支持直接解析为对象、获取原始响应体、自定义异常处理;
  • 与Spring MVC无缝集成:可复用HttpMessageConverter,无需额外配置即可处理JSON/XML。

3. 使用实例

依赖引入(Maven)

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId> <!-- Spring MVC依赖 -->
</dependency>

基本配置

@Configuration
public class RestClientConfig {
    @Bean
    public RestClient restClient(RestTemplateBuilder builder) {
        return RestClient.builder()
                .baseUrl("https://api.example.com")
                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
                .requestFactory(builder.requestFactory()) // 复用RestTemplate的请求工厂
                .build();
    }
}

核心操作示例

GET请求(获取列表)

List<User> users = restClient.get()
        .uri("/users?page={page}", 1)
        .retrieve() // 处理响应
        .body(List.class); // 解析为List<User>

PUT请求(更新资源)

User updatedUser = restClient.put()
        .uri("/users/{id}", 100)
        .body(new User("张三", 26))
        .retrieve()
        .onStatus(status -> status.is5xxServerError(), 
            (request, response) -> new RuntimeException("服务器错误")
        )
        .body(User.class);

获取原始响应

ResponseEntity<User> response = restClient.get()
        .uri("/users/{id}", 100)
        .exchange((request, response) -> { // 自定义响应处理
            if (response.getStatusCode().is2xxSuccessful()) {
                return ResponseEntity.ok(response.bodyTo(User.class));
            } else {
                return ResponseEntity.notFound().build();
            }
        });

四、三者对比:如何选择?

特性 RestTemplate WebClient RestClient
编程模型 同步阻塞 异步响应式(非阻塞) 同步(底层可优化I/O)
依赖模块 spring-web spring-webflux spring-web(6.1+)
返回类型 直接返回对象 Mono/Flux(响应式类型) 直接返回对象/ResponseEntity
并发能力 低(线程阻塞) 高(非阻塞I/O) 中(同步但API更高效)
适用场景 传统MVC、低并发 WebFlux、高并发、流式处理 现代MVC、同步场景替代RestTemplate
API风格 模板方法(如getForObject) 构建者模式(链式调用) 构建者模式(链式调用)
扩展灵活性 中等(拦截器配置繁琐) 高(支持过滤器、自定义编解码) 高(复用MVC的消息转换器)
学习成本 低 中(需了解响应式编程) 低(接近RestTemplate但更简洁)

五、总结:技术选型建议

  1. 新项目:

    • 若使用Spring WebFlux(响应式):优先选择WebClient;
    • 若使用Spring MVC(同步):优先选择RestClient(需Spring 6.1+/Boot 3.2+);
    • 避免使用RestTemplate,减少未来迁移成本。
  2. 现有项目:

    • 若RestTemplate运行稳定:无需强制迁移,继续使用即可;
    • 若需扩展功能(如拦截器、异步处理):逐步迁移到RestClient(同步)或WebClient(响应式)。
  3. 特殊场景:

    • 大文件上传下载、WebSocket:必选WebClient;
    • 简单同步请求、快速开发:RestClient更合适。

Spring的HTTP客户端演进,本质是对"性能"和"开发体验"的双重追求。RestTemplate的"退役"不是终点,而是Spring生态适应现代分布式架构的必然选择。选择合适的工具,既能提升系统性能,也能降低维护成本——这正是技术演进的核心价值。

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/hou-duan/4544

推荐阅读

  • Spring Boot 指定外部配置文件的方式
  • Spring Boot 配置加载优先级总结
  • 关于服务的探活端口和业务端口不一致有什么问题
  • SchedulingConfigurer详解
  • Spring WebFlux底层原理深度剖析-从响应式流到事件循环的全链路拆解
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: http RestClient RestTemplate Spring WebClient
最后更新:2025年10月29日

岁月同一天 8 月 8 日

回望过去的今天,你在写什么

  • 4 年前 2022年8月8日
    减肥四个月~

    今年四月初开始每天跳绳减肥,到了今天刚好四个月了。从一开始的每天跳绳十分钟到半个小时,再从半个小时到一个小时,最后又稳定…

相关文章
  • HandlerMethodArgumentResolver解析2025年3月14日
  • HTTP3与QUIC详解2025年12月17日
  • 分布式服务生成唯一不重复ID(24位字符串)2019年7月13日
  • Spring Boot 配置加载优先级总结2026年8月6日
  • Spring中@Autowired和@Resource的区别详解2021年1月15日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复
…

文章评论

还没有评论,快来抢沙发吧~

九年没联系的女友突然问我借钱,我开口道:四十万行么?不够了再说话。”前女友很是高兴地回复说:“够用,还是我男朋友有办法啊,你放心,我日后一定还给你,九年多没见了你现在干啥呢,这么有钱?”我呵呵一笑:“没事,不够用您尽管说话,俺现在改做抵押贷款了。”

听点儿音乐吧 朋友~
文章目录
最新 热点 随机
最新 热点 随机
Kratos+ v1.1.14版本更新说明 Spring Boot 指定外部配置文件的方式 Spring Boot 配置加载优先级总结 Claude Fable 5(claude-fable-5)深度详解 如何通过命令查看Java应用内存中对象数量 关于服务的探活端口和业务端口不一致有什么问题
给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊WordPress实现用户评论等级排行榜插件WordPress网站换了个字体,差点儿把样式换崩了
MybatisCodeHelperPro激活 解决kubectl exec -it xxxx-service-bfbd45bb9-ktvzj bash -n bit error: exec [POD] [COMMAND] is not supported anymore. Use exec [POD] -- [COMMAND] instead See 'kubectl exec -h' for help and examples Apollo配置中心中的protalDB的作用是什么 k8s + docker + Jenkins使用Pipeline部署SpringBoot项目时Jenkins错误集锦 彻底搞懂mysql日志系统binlog,redolog,undolog Spring事件驱动深度指南:从单机异步到亿级流量,比MQ更轻的架构神器
最近评论
Huo 发布于 8 小时前(08月07日) 挺有特色的主题,还是感觉 WP 的确是强大
李锋镝 发布于 21 小时前(08月07日) 没理解你想说啥
aboss 发布于 21 小时前(08月07日) 你的后台web-login?
李锋镝 发布于 22 小时前(08月07日) 这个专门的插件实现的功能更好更全,还能对接支付之类的
李锋镝 发布于 22 小时前(08月07日) 自定义登录地址是为了防止大部分机器人通过WP固定登录页面暴力破解用户账号密码
标签聚合
K8s 日常 Claude docker JVM WordPress Redis AI编程 多线程 SQL 架构 MySQL IDEA JAVA SpringBoot Spring AI 数据库 ElasticSearch 分布式
友情链接
  • Blogs·CN
  • 懋和道人
  • 旧时繁华
  • Honesty
  • 拾趣博客导航
  • 搬砖日记
  • 知向前端
  • 临窗旋墨
  • 皮皮社
  • 瓦匠个人小站
  • 志文工作室
  • 韩小韩博客
  • 风渡言
  • 彬红茶日记
  • 老张博客
  • Mr.Sun的博客
  • 韩情脉脉
  • 哥斯拉
  • 林羽凡

COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

正在博友圈履约中

域名年龄

Theme Kratos+ By Dylan Li

津ICP备2024022503号-3

京公网安备11011502039375号