Spring之WebFlux
一、前言
在spring5.0前,web技术栈都是阻塞式的,虽然servlet3.0引入了非阻塞API的使用,但是这种异步是不彻底的,因为比如filter、servlet在约定上还是同步的。所以Spring5.0 为web技术提供了一种全新的非阻塞与的技术栈,也就是webflux技术。
二、 阻塞Servlet
在Servlet 3.0之前的时代 Servlet都是阻塞的模式,我们都知道Servlet本身是不能运行的,它需要在Servlet容器里面运行,tomcat则是最常用的servlet容器之一。在tomcat的bio模式中会设置一个线程池+有界队列来处理和暂存用户的请求,当用户请求到来后tomcat容器会从线程池中拿出一个线程来处理用户的请求,具体是根据url调用具体的servlet或者controller进行处理,在servlet或者controller进行处理完毕前,也就是请求方在等待tomcat返回结果前一直处于阻塞状态,tomcat分配给该请求的线程也会一直被该请求占用。由于每个线程需要等到处理完毕后才能释放,所以当同时请求数远远大于tomcat线程池个数时候(并且由于队列是有界的),并且后端servlet或者controller处理比较慢时候,新的请求就会被拒绝,因为这时候tomcat线程池和队列已经被耗尽了。 需要注意的是tomcat也提供了NIO模式,使用select来让一个线程处理多个socket请求,这里不展开。
三、非阻塞Servlet
在Servlet 3.1时代提供了非阻塞的 API,这是tomcat接受到请求后还是会从tomcat的线程池中获取一个线程来处理该请求,但是这时候不是该线程直接来处理,而是把该请求转发给业务线程池进行处理,然后接受请求的线程就可以直接返回,用来接受新的请求。这种方式好处是tomcat线程池可以接受大量的请求,因为tomcat线程池中线程并没具体处理请求,而仅仅是转发。 这时候的请求模型如下
四、WebFlux
虽然servlet3.1引入了非阻塞API的使用,但是这种异步是不彻底的,因为比如filter、servlet在规范上还是同步的(https://www.zhihu.com/question/53498767)。所以Spring5.0 为web技术提供了一种全新的非阻塞与的技术栈,也就是webflux技术。 如上图左侧为传统基于servlet的Springmvc应用对应的技术栈,右侧为基于Reactor技术站的WebFlux。 WebFlux可以运行在 基于Servlet 3.1提供的非阻塞模式的servlet容器中,也可以运行在异步运行时框架,比如netty上。netty作为一个高性能异步网络通讯框架,其高效的Reactor线程池模型相比大家都有所了解,其boss线程池组只负责处理接受请求,worker线程池组中的每个线程可以处理多个请求的读写事件(而非阻塞servlet模式中业务线程池中每个线程只能同时处理一个请求的读写事件)。这时候模型为:
- 尝试Spring Boot2 WebFlux(启动失败了?不要怕)
- spring webflux
- Spring Boot 2.0 WebFlux 上手系列课程:快速入门(一)
- (5)Spring WebFlux快速上手——响应式Spring的道法术器
- 一文带你了解 Spring 5.0 WebFlux 应用场景
- Spring 5 的 WebFlux 开发反应式 Web 应用
- Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门
- spring-webflux中Flux 转String
- 使用 Spring 5 的 WebFlux 开发反应式 Web 应用(二)之函数式编程
- Spring WebFlux之HttpHandler的探索
- 深入浅出spring boot 2.x 08-spring5新框架 webFlux【笔记】
- Spring Boot 2.0 - WebFlux With MongoDB
- Spring Framework# WebFlux
- 响应式Spring的道法术器(Spring WebFlux 快速上手 + 全面介绍)
- Kotlin 使用 Spring WebFlux 实现响应式编程
- 朱晔和你聊Spring系列S1E5:Spring WebFlux小探
- spring webflux文件上传下载
- 【Spring5】使用 Spring Webflux 开发 Reactive 应用
- Spring Boot 2.0 WebFlux 上手系列课程:快速入门(一)
- 响应式Spring的道法术器(Spring WebFlux 教程)