跳到主要内容

Spring Boot 3.2同时支持SpringMVC和WebFlux

· 阅读需 3 分钟
linux_china

不少同学想在自己的项目中使用RSocket,但是考虑到自己的项目还是SpringMVC,没法迁移到WebFlux上,所以一直比较苦恼。 但是伴随着Spring Boot 3.2的发布,这个问题就迎刃而解了。

Reactor 3.6增加对Java 21 Virtual Thread的支持,详细请参考 What new is coming in reactor-core 3.6.0? 也就是借助新的BoundedElasticThreadPerTaskScheduler类,可以使用Virtual Thread来执行任务。

伴随着Spring Boot 3.2的发布,Spring Boot也增加了对Java 21 Virtual Thread的支持,这也意味着我们可以在一个项目中同时支持SpringMVC和WebFlux, 你再也不用担心如何Web项目如何混合些SpringMVC和WebFlux了。

首先我们要在pom.xml中,添加spring-boot-starter-web作为web基础框架,另外添加reactor-core作为对Reactive的支持,如下:


<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>

</dependencies>

接下来我们要在application.properties中,添加如下配置启动Virtual Thread的支持:

spring.threads.virtual.enabled=true

最后我们编写一个典型的SpringMVC的Controller,如下:

@RestController
public class PortalController {

@GetMapping("/where-am-i")
public String getThreadName() {
return Thread.currentThread().toString();
}

@GetMapping("/reactive")
public Mono<String> reactive() {
return Mono.just("Hello Reactor!").doOnNext(s -> {
System.out.println("Reactive on " + Thread.currentThread());
});
}
}

你会发现不借助spring-boot-starter-webflux你可以在SpringMVC中使用MonoFlux, 这样就可以在一个项目中同时支持SpringMVC和WebFlux了。

性能方面你不用担心,Reactive的调度是通过Virtual Thread来实现的,而不是传统的线程池,所以性能方面的担心是没有必要的。

总结一下:借助Java 21的Virtual Thread,Spring Boot 3.2通过Virtual Thread同时支持SpringMVC和WebFlux,所以我们再也不用担心如何在一个项目中同时支持SpringMVC和WebFlux了。 当然基于Reactive的RSocket也是完全没有问题的。