Spring Reactive响应式编程-WebFlux编程实战
springboot2 webflux 响应式编程学习路径 : https://zhuanlan.zhihu.com/p/36160025
先学习jdk8的lambda表达式和stream流编程,了解函数式编程的知识点和思想,接着学习jdk9的响应式流flux,理解响应式流概念,理解背压和实现机制。这2者学好之后,很容易理解webflux的基石reactor,再学习webflux就水到渠成了!
Reactive Stream
jdk9的响应式流
就是Reactive Stream
,也就是flow。其实和jdk8的stream没有一点关系。说白了就一个发布-订阅模式,一共只有4个接口,3个对象,非常简单清晰
什么是背压?
背压是指订阅者能和发布者交互,可以调节发布者发布数据的速率,解决把订阅者压垮的问题
我们重点理解背压在jdk9里面是如何实现的。关键在于发布者Publisher的实现SubmissionPublisher
的submit
方法是block方法。订阅者会有一个缓冲池,默认为Flow.defaultBufferSize() = 256。当订阅者的缓冲池满了之后,发布者调用submit方法发布数据就会被阻塞,发布者就会停(慢)下来;订阅者消费了数据之后(调用Subscription.request
方法),缓冲池有位置了,submit方法就会继续执行下去,就是通过这样的机制,实现了调节发布者发布数据的速率,消费得快,生成就快,消费得慢,发布者就会被阻塞,当然就会慢下来了
自定义 Processer(中间处理器,相当于是发布者的同时又是订阅者)代码示例
发布者生产的数据会存储到默认缓冲池的数组中发送给订阅者,默认缓冲池是256个长度,当缓冲区满了而订阅者还没来的及处理数据时,发布者就会被block(阻塞)而停止生产数据,直到订阅者消费完缓冲区中的数据而产生空位时发布者才会重新生成新的数据
Spring WebFlux
初识Spring WebFlux
Spring WebFlux 是 Spring Framework 5.0中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞
的,并且通过Reactor项目实现了Reactive Streams规范。
官方地址: https://spring.io/reactive
架构 | 说明 |
---|---|
spring-webmvc + Servlet + Tomcat | 命令式的、同步阻塞的 |
spring-webflux + Reactor + Netty | 响应式的、异步非阻塞的 |
所谓异步非阻塞是针对服务端而言的,是说服务端可以充分利用CPU资源去做更多事情,这与客户端无关,客户端该怎么请求还是怎么请求。
架构 | 说明 |
---|---|
Reactive Streams | 用于构建高吞吐量、低延迟应用的规范 |
Reactor | 基于Reactive Streams 规范的实现,它是一个完全非阻塞的基础,且支持背压 |
Spring WebFlux | 基于Reactor实现了完全异步非阻塞的一套web框架,是一套响应式堆栈 |
编写响应式代码之前,我们还需要了解2个重要的概念,就是异步servlet
和SSE(server-sent events)
。
异步servlet
学习异步servlet我们最重要的了解同步servlet阻塞了什么?为什么需要异步servlet?异步servlet能支持高吞吐量的原理是什么?
-
同步servlet
servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,servlet容器的线程就会等(阻塞)多久,而servlet容器的线程是由上限的,当请求多了的时候servlet容器线程就会全部用完,就无法再处理请求(这个时候请求可能排队也可能丢弃,得看如何配置),就会限制了应用的吞吐量! -
异步servlet
servlet容器的线程不会傻等业务代码处理完毕,而是直接返回(继续处理其他请求),给业务代码一个回调函数(asyncContext.complete()),业务代码处理完了再通知我!这样就可以使用少量的线程处理更加高的请求,从而实现高吞吐量!
代码示例:
- 同步servlet
- 异步servlet
运行上面代码,业务代码花了5秒,但servlet容器的线程几乎没有任何耗时。而如果是同步servlet的,线程就会傻等5秒,这5秒内这个线程只处理了这一个请求/。
异步servlet在处理耗时任务时会立马执行完成并且将任务放到另一个线程中去运行,这样我们的这个servlet主线程就不会被阻塞从而能够去执行其他的任务
SSE(Server-Sent Events)
响应式流里面,可以多次返回数据(其实和响应式没有关系),使用的技术就是H5的SSE。我们学习技术,API的使用只是最初级也是最简单的,更加重要的是需要知其然并知其所以然,否则你只能死记硬背不用就忘!我们不满足在spring里面能实现sse效果,更加需要知道spring是如何做到的。其实SSE很简单,我们花一点点时间就可以掌握,我们在纯servlet环境里面实现。我们看代码,这里一个最简单的示例。
关键是ContentType 是 "text/event-stream"
,然后返回的数据有固定的要求格式即可。
如果我们想要在前端接受和使用事件流,可以使用以下方式
使用场景:服务器向客户端推送数据,例如聊天室
WebFlux完整案例
搭建项目
- 添加mongodb-reactive依赖
- 添加mongodb注解
- 添加User对象
- 新建user的数据库操作对象UserRepository
- 新建Controller
- 安装和启动mongodb
RouterFunction模式
webflux的另一种开发模式,和以前的Controller进行对应
- HandlerFunction(输入ServerRequest返回ServerResponse)
- 编写路由类 RouterFunction(请求URL和HandlerFunction对应起来)
源码下载地址:https://gitee.com/javaming/springboot-webflux
__EOF__

本文链接:https://www.cnblogs.com/mpyidudu/p/15503519.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现