news 2026/6/10 12:43:10

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/6/10 8:18:44

AI写论文不用愁!4款AI论文生成神器,高效完成各类学术论文!

还在为撰写期刊论文而烦恼吗&#xff1f;面对众多的文献、繁琐的格式以及不断的修改&#xff0c;很多学术工作者常常感到效率低下确实是一种普遍现象&#xff01;但你无需再感到焦虑&#xff0c;接下来将向你推荐四款经过实测的AI论文写作工具&#xff0c;从文献检索到论文大纲…

作者头像 李华
网站建设 2026/6/10 8:16:30

AI写论文新选择!4款超实用AI论文生成工具,高效产出优质论文!

还在为写期刊论文而感到烦恼吗&#xff1f;面对海量的文献资料和复杂的格式要求&#xff0c;以及频繁的修改反馈&#xff0c;许多学术人员都感到效率低下&#xff0c;真是难以忍受&#xff01;但不用担心&#xff0c;这里有四款经过实测的AI写论文工具可以帮你解决这些问题。无…

作者头像 李华
网站建设 2026/6/10 8:19:27

掌握AI教材写作技巧,低查重教材轻松一键生成!

一、教材编写的困境与 AI 工具的出现 教材的初步草稿一旦完成&#xff0c;接下来的修改和优化简直是像在“折磨”自己&#xff01;要仔细通读全文&#xff0c;找出那逻辑不通的地方和知识错误&#xff0c;花费的时间真是相当巨大&#xff1b;而且一旦调整一个章节&#xff0c;…

作者头像 李华
网站建设 2026/6/10 8:14:03

有关漏洞挖掘的一些总结,新手小白网络入门必看的经验教训!

时隔一年多以后再次看本文&#xff0c;依然给我一些启发&#xff0c;尤其是经过一定量的实践以后&#xff0c;发现信息收集真乃漏洞挖掘(渗透测试)的本质&#xff0c;这里再次回顾一下本文&#xff0c;尤其是里面如何评估一个项目(目标)的难度&#xff0c;值得学习与借鉴&#…

作者头像 李华
网站建设 2026/6/9 17:29:02

芯片内部的层级世界:从基底到互联的精密架构

一块指甲盖大小的芯片,承载着现代科技的核心算力,其内部并非单一结构,而是由多层功能迥异的精密结构堆叠而成。这些层级从下到上各司其职,既有支撑基础的“地基”,也有实现核心功能的“核心部件”,更有连接全局的“神经网络”。每一层的材料选择、工艺精度都直接决定了芯…

作者头像 李华