news 2026/8/6 13:46:13

Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端

从 RestTemplate 迁移到 WebClient

RestTemplate 已在 Spring 5 中被标记为弃用,Spring 官方推荐使用 WebClient 作为替代方案。WebClient 是响应式非阻塞 HTTP 客户端,支持同步和异步调用。

创建 WebClient 实例:

WebClient webClient = WebClient.builder() .baseUrl("https://api.example.com") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build();

执行 GET 请求:

Mono<String> response = webClient.get() .uri("/users/{id}", userId) .retrieve() .bodyToMono(String.class);

处理 POST 请求:

Mono<User> createdUser = webClient.post() .uri("/users") .bodyValue(newUser) .retrieve() .bodyToMono(User.class);

使用 HTTP Interface 声明式客户端

Spring 6 引入了 HTTP Interface,允许通过接口声明的方式定义 HTTP 客户端。这种方式更加简洁,减少了样板代码。

定义接口:

@HttpExchange(url = "/users", contentType = "application/json") public interface UserClient { @GetExchange("/{id}") User getUser(@PathVariable String id); @PostExchange User createUser(@RequestBody User user); }

创建代理实例:

UserClient userClient = WebClient.create() .mutate() .baseUrl("https://api.example.com") .build() .createClient(UserClient.class);

处理错误和重试机制

WebClient 提供了灵活的错误处理方式。可以通过 onStatus 方法处理特定状态码:

Mono<User> user = webClient.get() .uri("/users/{id}", userId) .retrieve() .onStatus(status -> status.is4xxClientError(), response -> Mono.error(new UserNotFoundException())) .bodyToMono(User.class);

添加重试逻辑:

Mono<User> userWithRetry = webClient.get() .uri("/users/{id}", userId) .retrieve() .bodyToMono(User.class) .retryWhen(Retry.backoff(3, Duration.ofSeconds(1)));

性能优化建议

WebClient 默认使用 Reactor Netty 作为底层实现,可以配置连接池优化性能:

HttpClient httpClient = HttpClient.create() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) .responseTimeout(Duration.ofSeconds(5)) .doOnConnected(conn -> conn.addHandlerLast(new ReadTimeoutHandler(5))); WebClient webClient = WebClient.builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) .baseUrl("https://api.example.com") .build();

对于高并发场景,建议使用连接池:

ConnectionProvider provider = ConnectionProvider.builder("myConnectionPool") .maxConnections(100) .pendingAcquireTimeout(Duration.ofSeconds(30)) .build(); HttpClient httpClient = HttpClient.create(provider);

测试策略

测试 WebClient 时可以使用 MockWebServer 模拟 HTTP 服务:

@Test void testWebClient() throws IOException { MockWebServer server = new MockWebServer(); server.enqueue(new MockResponse() .setBody("{\"name\":\"test\"}") .addHeader("Content-Type", "application/json")); WebClient webClient = WebClient.create(server.url("/").toString()); Mono<User> userMono = webClient.get().retrieve().bodyToMono(User.class); User user = userMono.block(); assertEquals("test", user.getName()); server.shutdown(); }

对于 HTTP Interface,可以使用 Mockito 进行测试:

@Mock private UserClient userClient; @Test void testUserClient() { when(userClient.getUser("1")).thenReturn(new User("1", "test")); User user = userClient.getUser("1"); assertEquals("test", user.getName()); }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/1 19:16:57

【OptisLang】设计优化

【OptisLang】设计优化 引言 正文 设计优化的三个重点 Author: JiJi \textrm{Author: JiJi} Author: JiJi Created Time: 2026.02.06 \textrm{Created Time: 2026.02.06} Created Time: 2026.02.06

作者头像 李华
网站建设 2026/8/6 6:00:17

【小程序毕设源码分享】基于springboot+小程序的在线答题微信小程序的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/8/6 9:51:26

当人类Delta化:AI时代的智能基线与意义重构

在人工智能技术迭代的浪潮中&#xff0c;我们正站在一个前所未有的临界点上。当多智能体协作系统&#xff08;Agent Teams&#xff09;开始展现出惊人的涌现能力时&#xff0c;一个深刻的转变正在发生&#xff1a;智能不再是人类的专属特权&#xff0c;而是变成了可以被拆解、组…

作者头像 李华
网站建设 2026/7/30 23:47:09

从0到1,实现了能自动处理任务的AI智能体

一、先明确目标&#xff1a;我们要做一个什么样的智能体&#xff1f;在动手写第一行代码之前&#xff0c;定义清晰的目标至关重要。我不想做一个“聊天机器人”&#xff0c;而是希望它能主动完成任务。我设定的Demo目标是&#xff1a; “帮我分析今日热点&#xff0c;并总结成一…

作者头像 李华
网站建设 2026/8/3 8:50:46

基于MATLAB的MIMO系统模型预测控制(MPC)仿真实现

一、MPC控制器设计 1.1 关键参数设置 Np 15; % 预测时域 Nc 5; % 控制时域 Q eye(Np); % 输出权重矩阵 R 0.1*eye(Nc); % 输入增量权重矩阵1.2 约束条件定义 umin -40*ones(Nc,1); % 输入下限 umax 40*ones(Nc,1); % 输入上限 ymin -50*ones(Np,1); % 输出下限 …

作者头像 李华