本文共 3116 字,大约阅读时间需要 10 分钟。
Spring WebFlux 是 Spring 5.0 版本后提供的一套响应式编程风格的 Web 开发框架,基于 Reactor 框架开发,支持 Netty、Undertow 及 3.1 版本以上的 Servlet 容器。它能够与 Spring WebMvc 同时使用,或单独使用,适用于需要非阻塞、异步处理的场景。
响应式编程的定义
响应式编程强调非阻塞、异步的处理方式。当发起一个网络请求时,CPU 不会阻塞等待响应, 而是立即继续执行其他任务。当数据返回时,系统再进行处理,提升系统吞吐量。响应式编程的理念延续了 Java 8 中的 Stream API 标准化规范。
Spring WebFlux 的响应式 API
Spring WebFlux 提供两种响应式 API:Mono 和 Flux。Mono 用于处理单个对象, Flux 用于处理多个对象。例如:
Mono person = personDao.getPerson(personId); Flux people = personDao.listAllPeople();WebFlux 可以与其他响应式框架(如 RxJava)协同工作,提供灵活的选择。
选择 WebMvc 还是 WebFlux
WebMvc 和 WebFlux 分别适用于不同的场景。WebMvc 适用于传统的阻塞式 Web 开发,尤其适合依赖阻塞 API(如 JDBC)的项目。而 WebFlux 则更适合需要非阻塞、高吞吐量的应用,尤其是网络延迟敏感的场景。以下是选择依据:
WebFlux 基于 Netty 的非阻塞 I/O 模型,仅需少量工作线程处理请求。相比 WebMvc 的线程池模型,WebFlux 提高了并发处理能力,系统吞吐量更高。其核心原理是使用事件循环队列(Event loop),减少 CPU 等待时间。
使用 Spring Boot 构建 WebFlux 应用,依赖项如下:
org.springframework.boot spring-boot-starter-webflux
定义 Person 对象并创建控制器:
public class Person { private Integer id; private Integer age; private String name; } @Configuration public class PersonRouter { @Resource private PersonHandler personHandler; @Bean public RouterFunction serverResponse() { return RouterFunctions.route() .GET("/person/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::getPerson) .GET("/", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::listPeople) .POST("/", personHandler::createPerson) .build(); } }在 PersonHandler 中实现业务逻辑:
@Component public class PersonHandler { @Resource private PersonRepository personDao; public Mono listPeople(ServerRequest request) { return personDao.listAllPeople() .flatMap(users -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .bodyValue(users)); } public Mono createPerson(ServerRequest request) { return request.bodyToMono(Person.class) .flatMap(user -> personDao.savePerson(user)) .flatMap(savedUser -> ServerResponse.ok().build()); } public Mono getPerson(ServerRequest request) { int personId = Integer.parseInt(request.pathVariable("id")); return personDao.getPerson(personId) .flatMap(user -> ServerResponse.ok() .contentType(MediaType.APPLICATION_JSON) .bodyValue(user)) .switchIfEmpty(ServerResponse.notFound().build()); } } 启动项目后,访问 http://localhost:8080/person/1 即可测试。
全新构建的手机端微商城项目,涵盖商品浏览、搜索、购物车、下单等模块,主流技术栈如 Spring Boot、MyBatis Plus、Redis、RabbitMQ 等,适合从零开始学习。项目文档详细,线上演示地址为 https://www.markerhub.com/vueshop。
转载地址:http://lfvfk.baihongyu.com/