共计 2767 个字符,预计需要花费 7 分钟才能阅读完成。
智慧女孩不秃头
2023-12-12 14:42:49
浏览数 (1939)
WebFlux 是一个基于反应式编程模型的 Web 框架,它提供了一种处理高并发和高吞吐量的 Web 应用程序的解决方案。本文将介绍 WebFlux 的概念、反应式编程的核心 API 和编程模型,并探讨学习 WebFlux 的重要性。
WebFlux 是什么?
WebFlux 是 Spring5 添加的一个新模块,是一个使用响应式编程和异步非阻塞的 Web 开发框架,它的功能和 Spring MVC 类似,但是它可以更好地利用多核处理器和高并发连接,提高系统的吞吐量和伸缩性。它完全无阻塞,支持反应流反向压力,可在 Netty、Undertow 和 Servlet 3.1+ 容器等服务器上运行。核心是基于 Reactor 的相关 API 实现的。
什么是反应式编程?
- 反应式一词指的是围绕对变化做出反应而构建的编程模型,如网络组件对 I/O 事件做出反应、用户界面控制器对鼠标事件做出反应等。从这个意义上说,非阻塞就是反应式,因为我们现在的模式是在操作完成或数据可用时对通知做出反应,而不是被阻塞。
- 同时反应式与非阻塞反向压力建立了联系。在同步的命令式代码中,阻塞调用是一种自然的反向压力,它迫使调用者等待。而在非阻塞代码中,控制事件的速度就变得非常重要,这样快速的生产者就不会压倒其消费者(目的地)。
- 反应流(Reactive Streams)是一种规范(Java 9 也采用了这种规范),它定义了异步组件与反向压力之间的交互。例如,数据存储库(作为发布者)可以生成数据,然后 HTTP 服务器(作为订阅者)可以将数据写入响应。反应流的主要目的是让订阅者控制发布者生成数据的快慢。
WebFlux 是如何实现响应式编程的?
- WebFlux 是基于 Reactor 库的,Reactor 是一个实现了响应式流规范的 Java 库,它提供了 Flux 和 Mono 两种类型的数据流,分别表示多个和单个的异步数据源。WebFlux 使用 Flux 和 Mono 来处理 Web 请求和响应,以及与数据库和其他服务的交互,从而实现了端到端的异步非阻塞的处理流程。
- WebFlux 支持两种编程模式,一种是基于注解的,类似于 Spring MVC,使用
@Controller
和@RequestMapping
等注解来定义控制器和路由;另一种是基于函数式的,使用RouterFunction
和HandlerFunction
来编写更灵活和函数式的代码。
WebFlux 有什么优势和局限性?
- WebFlux 的主要优势是可以提高 Web 应用的性能和效率,特别是在 IO 密集型和高并发的场景下,WebFlux 可以使用更少的线程和资源来处理更多的请求,从而减少延迟和内存占用。WebFlux 也可以更好地适应微服务和云原生的架构,因为它可以更容易地实现服务间的异步通信和流式处理。
- WebFlux 的主要局限性是它需要使用响应式编程的思维和技巧来编写和理解代码,这对于习惯了同步阻塞编程的开发者来说可能有一定的学习曲线和挑战。WebFlux 也需要与其他支持响应式编程的库和框架配合使用,例如 Reactor,RxJava,Spring Data Reactive 等,否则可能会出现阻塞或不兼容的问题。
应用示例
环境配置
dependency>
groupId>org.springframework.bootgroupId>
artifactId>spring-boot-starter-webfluxartifactId>
dependency>
注意: 不要再引 spring-boot-starter-web 包,否则默认还是使用的 Servlet 栈
基于注解
@RestController
@RequestMapping("/demos")
public class DemoController {
private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
@GetMapping("/index")
public Mono index() {logger.info("start {}, {}", Thread.currentThread().getName(), System.currentTimeMillis()) ;
Mono result = Mono.just(666) ;
logger.info("end {}, {}", Thread.currentThread().getName(), System.currentTimeMillis()) ;
return result;
}
}
基于注解的方式处理返回值不一样外其它与传统的 WebMVC 一样。
基于函数式
@Bean
public RouterFunction router1() {return RouterFunctions.route()
.GET("/r1", request -> {String id = request.queryParam("id").orElse(null) ;
if ("2".equals(id)) {throw new RuntimeException("Router Param id Error...") ;
}
return ServerResponse.ok().bodyValue("你输入的是 id =" + id) ;
}).build() ;}
函数式,我们只需像定义普通的 bean 一样即可,返回值为RouterFucntion
。
HandlerFunction
处理:该函数接收 ServerRequest
并返回延迟的 ServerResponse
(即 Mono
)。请求和响应对象都不可变。HandlerFunction
相当于基于注解的编程模型中 @RequestMapping
方法的主体。
总结
WebFlux 作为一种新一代的 Web 框架,具有响应式能力、非阻塞 I / O 和函数式编程风格等优势。它适用于需要处理高并发和高吞吐量的应用场景,并在微服务架构和云原生应用开发中表现出色。然而,学习和采用 WebFlux 可能需要一些时间和精力,并且在迁移到 WebFlux 时需要考虑现有代码的调整和迁移工作。因此,您应该根据您的项目需求和团队的技术能力来决定是否值得学习和采用 WebFlux。了解其特点和优势,并与团队进行讨论和评估,以做出明智的决策。
如果你对编程知识和相关职业感兴趣,欢迎访问编程狮官网(https://www.w3cschool.cn/)。在编程狮,我们提供广泛的技术教程、文章和资源,帮助你在技术领域不断成长。无论你是刚刚起步还是已经拥有多年经验,我们都有适合你的内容,助你取得成功。
原文地址: 探索现代 Web 开发的未来:新一代 Web 框架 WebFlux