spring webflux
Spring WebFlux,是 Spring Framework 5.0 中引入的响应式(Reactive)Web 框架,它主要的作用和使用方式如下:
1. Spring WebFlux 的主要作用
- 实现非阻塞(Non-blocking)和异步(Asynchronous)的 Web 应用: 这是 WebFlux 最核心的价值。传统的 Spring MVC 默认基于 Servlet API,通常是阻塞式的(每个请求占用一个线程直到处理完成)。WebFlux 使用响应式编程模型,能以较少的线程处理更高的并发请求,提高资源利用率和吞吐量,尤其适合 I/O 密集型的场景。
- 处理高并发场景: 由于其非阻塞的特性,WebFlux 在处理大量并发连接时表现优异。
- 基于 Reactor 库: WebFlux 底层依赖 Reactor 库,其核心概念是
Flux
和Mono
。Flux
: 表示包含 0 到 N 个元素的异步序列。Mono
: 表示包含 0 或 1 个元素的异步序列。
- 支持多种运行时: 它可以运行在传统的 Servlet 容器(如 Tomcat、Jetty,需要支持 Servlet 3.1+)中,也能运行在支持 NIO 的容器(如 Netty、Undertow)中,通常配合 Netty 使用以发挥最大性能。
2. Spring WebFlux 的使用方式
Spring WebFlux 提供了两种开发模式:
A. 基于注解的控制器(Annotation-based Controllers)
这与传统的 Spring MVC 非常相似,你可以使用 @Controller
、@RequestMapping
等注解,但方法的返回值通常是 Mono
或 Flux
:
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/users")
public class UserController {// 返回单个用户,使用 Mono@GetMapping("/{id}")public Mono<User> getUser(@PathVariable Long id) {// 假设 service.findById() 返回一个 Mono<User>return userService.findById(id); }// 返回用户列表,使用 Flux@GetMappingpublic Flux<User> listUsers() {// 假设 service.findAll() 返回一个 Flux<User>return userService.findAll();}
}
B. 函数式端点(Functional Endpoints)
这是一种更纯粹的函数式编程模型,通过 RouterFunction
来定义路由(相当于 @RequestMapping
),通过 HandlerFunction
来处理请求(相当于 Controller 中的方法):
1. 定义处理器(Handler):
import reactor.core.publisher.Mono;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;public class UserHandler {// 处理获取单个用户的请求public Mono<ServerResponse> getUser(ServerRequest request) {Long id = Long.valueOf(request.pathVariable("id"));// 实际的业务逻辑...Mono<User> userMono = ...; // 获取数据return ServerResponse.ok().body(userMono, User.class);}
}
2. 定义路由(Router):
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.springframework.web.reactive.function.server.RequestPredicates.*;
import static org.springframework.web.reactive.function.server.RouterFunctions.route;@Configuration
public class RouterConfig {@Beanpublic RouterFunction<ServerResponse> userRoutes(UserHandler userHandler) {return route(GET("/users/{id}"), userHandler::getUser);// .andRoute(...) 可以定义更多路由}
}
总结:
Spring WebFlux 提供了构建高性能、可扩展的响应式 Web 应用程序的能力,特别适用于需要处理高并发和 I/O 密集型操作的微服务或 API Gateway 场景。