使用 Spring Webflux 进行响应式编程
Posted: Thu Jan 30, 2025 8:09 am
在这篇博文中,我们想简要概述 Spring Webflux。此外,本文还提供了一些入门帮助以及精选的代码示例,以便您可以成功开始该项目。
维基百科对反应式编程的描述如下:
“在数据处理中,反应式编程是一种面向数据流的编程范式。”
底层执行模型自动传播数据流中的更改。从版本 5 开始,Spring 框架支持响应式编程,并为 Web 应用程序、数据库访问、安全性和基于流的计算提供响应式实现。
Spring MVC 等经典编程模型为每个请求使用一个线程,并占用它 平面设计电子邮件列表 直到当前任务完成,然后再次释放它。例如,如果在代码编辑期间必须处理响应时间较慢的数据库或远程系统,则线程必须被阻塞很长时间。为了保持响应能力,通常会维护更大的线程池。根据场景的不同,一个Java线程可以快速分配1MB内存,这很快就会导致成本增加,尤其是在云环境中。
反应堆项目
Spring框架使用开源Reactor项目作为实现响应式编程的基础。 Reactor 是基于 Reactive Streams 规范的 Java 虚拟机的开源、非阻塞反应式编程环境。它直接基于 Java 8 的功能 API,并自始至终使用 CompletableFuture、Stream 和 Duration。此外,Reactor 支持与reactor-netty 项目的非阻塞进程间通信,该项目为HTTP 提供了具有背压功能的网络引擎。 Reactive Streams 规范为 JVM 以及 Javascript 提供了一定的标准化,并且基于以下接口:
订阅者:订阅者订阅发布者并通过回调获知新的进展。
订阅:订阅描述了订阅者和发布者之间的关系。
发布者:发布者负责将数据发布给订阅者。
处理器:处理器转换在发布者和订阅者之间传输的元素。
Reactor项目提供了发布者接口的两种实现,Mono和Flux,下面的例子中常用到它们。 Flux 实现为 0-N 元素的异步序列,Mono 实现为 0-1 元素。
如何使用Spring Webflux?
Reactor API 提供了大量的方法。有各种各样的教程,但它可能会让人不知所措,尤其是在开始使用 Webflux 时。
常见网站上已经有很多关于如何使用 Spring Webflux 的教程。然而,这些通常仅限于外部通信,即使用其他 REST API 的控制器、数据库存储库和 Web 客户端。根据我们的经验,这是问题较少的部分,因为大部分工作已经通过用 Spring Webflux 替换相关依赖项并相应地调整方法签名来完成。
维基百科对反应式编程的描述如下:
“在数据处理中,反应式编程是一种面向数据流的编程范式。”
底层执行模型自动传播数据流中的更改。从版本 5 开始,Spring 框架支持响应式编程,并为 Web 应用程序、数据库访问、安全性和基于流的计算提供响应式实现。
Spring MVC 等经典编程模型为每个请求使用一个线程,并占用它 平面设计电子邮件列表 直到当前任务完成,然后再次释放它。例如,如果在代码编辑期间必须处理响应时间较慢的数据库或远程系统,则线程必须被阻塞很长时间。为了保持响应能力,通常会维护更大的线程池。根据场景的不同,一个Java线程可以快速分配1MB内存,这很快就会导致成本增加,尤其是在云环境中。
反应堆项目
Spring框架使用开源Reactor项目作为实现响应式编程的基础。 Reactor 是基于 Reactive Streams 规范的 Java 虚拟机的开源、非阻塞反应式编程环境。它直接基于 Java 8 的功能 API,并自始至终使用 CompletableFuture、Stream 和 Duration。此外,Reactor 支持与reactor-netty 项目的非阻塞进程间通信,该项目为HTTP 提供了具有背压功能的网络引擎。 Reactive Streams 规范为 JVM 以及 Javascript 提供了一定的标准化,并且基于以下接口:
订阅者:订阅者订阅发布者并通过回调获知新的进展。
订阅:订阅描述了订阅者和发布者之间的关系。
发布者:发布者负责将数据发布给订阅者。
处理器:处理器转换在发布者和订阅者之间传输的元素。
Reactor项目提供了发布者接口的两种实现,Mono和Flux,下面的例子中常用到它们。 Flux 实现为 0-N 元素的异步序列,Mono 实现为 0-1 元素。
如何使用Spring Webflux?
Reactor API 提供了大量的方法。有各种各样的教程,但它可能会让人不知所措,尤其是在开始使用 Webflux 时。
常见网站上已经有很多关于如何使用 Spring Webflux 的教程。然而,这些通常仅限于外部通信,即使用其他 REST API 的控制器、数据库存储库和 Web 客户端。根据我们的经验,这是问题较少的部分,因为大部分工作已经通过用 Spring Webflux 替换相关依赖项并相应地调整方法签名来完成。