SpringBoot 3 开发随笔

SpringBoot 3 版本

2022 年 11 月 24 日,SpringBoot 3.0 正式发布了。此版本包含了 12 个月以来 151 个人的 5700 多次 Commit 的工作结晶。这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本。

新变化

  • 支持响应式编程
  • 支持 Spring Framework 6.0
  • 支持 GraalVM native images
  • Spring 自身与第三方包版本升级
  • 最低支持 JDK 17,最高支持 JDK 19
  • 从 Java EE API (Javax) 迁移到 Jakarta EE API
  • 自动配置的包位置变化
    • 旧版本: META-INF/spring.factories
    • 新版本: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

新特性

  • 函数式 Web 开发
  • ProblemDetails,用于返回新格式的错误信息

Spring HTTP 客户端的选择

在 Spring 框架中,RestTemplateWebClientRestClient 是用于进行 HTTP 请求的不同客户端工具。它们各自具有不同的特性和适用场景。

RestTemplate

  • 简介

    • RestTemplate 是 Spring 提供的传统同步 HTTP 客户端,自 Spring 3 版本以来一直被广泛使用。
  • 特点

    • 同步阻塞:请求是同步执行的,调用线程会阻塞等待响应返回。
    • 易于使用:提供了简洁的 API,适合简单的 REST 调用。
    • 功能全面:支持多种 HTTP 方法(GET、POST、PUT、DELETE 等)、消息转换、异常处理等。
  • 适用场景

    • 适用于简单的、对性能和并发要求不高的应用场景。
    • 现有项目中已经使用 RestTemplate,且不需要迁移到异步 I/O 模型。
  • 注意事项

    • Spring 官方已宣布 RestTemplate 进入维护模式,不再推荐用于新项目的开发,未来可能会逐步弃用。

WebClient

  • 简介

    • WebClient 是 Spring 5 引入的非阻塞、响应式 HTTP 客户端,作为 Spring WebFlux 的一部分提供。
  • 特点

    • 异步非阻塞:基于 Reactor 框架,支持异步和响应式编程模式,大大提升应用的并发性能。
    • 功能强大:支持流式数据处理、请求过滤器、重试机制等高级功能。
    • 灵活性高:可以与响应式框架(如 Reactor、RxJava)无缝集成,也支持同步调用。
  • 适用场景

    • 适用于需要高并发、低延迟的微服务架构或响应式应用。
    • 新项目开发,尤其是采用 Spring WebFlux 的项目。
  • 示例代码

1
2
3
4
5
6
7
8
9
10
WebClient webClient = WebClient.builder()
.baseUrl("https://api.example.com")
.build();

Mono<String> response = webClient.get()
.uri("/data")
.retrieve()
.bodyToMono(String.class);

response.subscribe(System.out::println);

RestClient

  • 简介

    • RestClient 是 Spring 在较新版本(比如 Spring Framework 6)中引入的现代化 HTTP 客户端,旨在统一和简化客户端调用。
  • 特点

    • 声明式 API:支持通过接口定义 REST 客户端,类似于 Feign 的方式,提升代码的可读性和可维护性。
    • 类型安全:通过接口和注解定义请求和响应,减少运行时错误。
    • 集成现代特性:更好地支持 Kotlin、协程等现代编程特性。
  • 适用场景

    • 适用于希望使用声明式方式定义 HTTP 客户端的项目。
    • 需要类型安全和高可维护性的应用。
  • 示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RestClient
public interface ExampleClient {

@GetMapping("/data")
Mono<String> getData();

}

@SpringBootTest
public class HttpTest {

@Autowired
private ExampleClient exampleClient;

@Test
public void run() {
exampleClient.getData().subscribe(System.out::println);
}

}

最佳实践

  • 新项目开发:推荐使用 WebClientRestClient,其中 WebClient 更适合需要响应式和异步处理的场景,而 RestClient 提供了更现代化的声明式 API。
  • 现有项目维护:如果项目已经广泛使用 RestTemplate,且迁移成本较高,可以继续使用 RestTemplate,但建议规划逐步迁移到 WebClientRestClient
  • 性能需求:对于高并发和低延迟要求的应用,WebClientRestClient 提供了更好的性能和扩展性。