博客
关于我
Spring赌上未来:响应式的 WebFlux 框架更优雅,性能更强!
阅读量:796 次
发布时间:2023-02-26

本文共 3116 字,大约阅读时间需要 10 分钟。

Spring WebFlux 简介

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 则更适合需要非阻塞、高吞吐量的应用,尤其是网络延迟敏感的场景。以下是选择依据:

  • 已有 WebMvc 项目且运行良好,无需改造。
  • 需要非阻塞网络处理或复杂度较低的微服务
  • 项目中有大量外部系统调用,可考虑使用 WebFlux 的 WebClient

WebFlux 的并发模型

WebFlux 基于 Netty 的非阻塞 I/O 模型,仅需少量工作线程处理请求。相比 WebMvc 的线程池模型,WebFlux 提高了并发处理能力,系统吞吐量更高。其核心原理是使用事件循环队列(Event loop),减少 CPU 等待时间。

WebFlux 代码示例

使用 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/

你可能感兴趣的文章
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
查看>>
OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
查看>>
OSPF技术连载6:OSPF 多区域,近7000字,非常详细!
查看>>
OSPF技术连载7:什么是OSPF带宽?OSPF带宽参考值多少?
查看>>
OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
查看>>
OSPF故障排除技巧
查看>>
spring配置文件中<context:property-placeholder />的使用
查看>>
OSPF有哪些优势?解决了RIP的什么问题?
查看>>
OSPF理论
查看>>
OSPF的七种类型LSA
查看>>
OSPF的安全性考虑:全面解析与最佳实践
查看>>
OSPF知识点大全,网络工程师快速收藏!
查看>>
ospf综合实验2 2012/9/8
查看>>
OSPF规划两大模型:双塔奇兵、犬牙交错
查看>>
OSPF认证
查看>>
OSPF设计原则,命令以H3C为例
查看>>
ospf路由 华3_动态路由OSPF基本原理及配置,一分钟了解下
查看>>
OSPF路由协议配置
查看>>
OSPRay 开源项目教程
查看>>