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线程池和队列已经被耗尽了。

image.png

需要注意的是tomcat也提供了NIO模式,使用select来让一个线程处理多个socket请求,这里不展开。

三、非阻塞Servlet

在Servlet 3.1时代提供了非阻塞的 API,这是tomcat接受到请求后还是会从tomcat的线程池中获取一个线程来处理该请求,但是这时候不是该线程直接来处理,而是把该请求转发给业务线程池进行处理,然后接受请求的线程就可以直接返回,用来接受新的请求。这种方式好处是tomcat线程池可以接受大量的请求,因为tomcat线程池中线程并没具体处理请求,而仅仅是转发。 这时候的请求模型如下:

image.png

四、WebFlux

虽然servlet3.1引入了非阻塞API的使用,但是这种异步是不彻底的,因为比如filter、servlet在约定上还是同步的。所以Spring5.0 为web技术提供了一种全新的非阻塞与的技术栈,也就是webflux技术。

image.png

如上图左侧为传统基于servlet的Springmvc应用对应的技术栈,右侧为基于Reactor技术站的WebFlux。 WebFlux可以运行在 基于Servlet 3.1提供的非阻塞模式的servlet容器中,也可以运行在异步运行时框架,比如netty上。

netty作为一个高性能异步网络通讯框架,其高效的Reactor线程池模型相比大家都有所了解,其boss线程池组只负责处理接受请求,worker线程池组中的每个线程可以处理多个请求的读写事件(而非阻塞servlet模式中业务线程池中每个线程只能同时处理一个请求的读写事件)。这时候模型为:

image.png

最后 Java并发编程之美欢迎订购

image.png

image.png

image.png

image.png

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏武培轩的专栏

搜狗面经汇总

volatile是变量修饰符,其修饰的变量具有可见性,Java的做法是将该变量的操作放在寄存器或者CPU缓存上进行,之后才会同步到主存,使用volatile修饰...

25260
来自专栏SpringBoot

srpingboot2 session过期时间

59010
来自专栏java思维导图

Spring MVC 到 Spring BOOT的简化之路

从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信...

26320
来自专栏成猿之路

Spring MVC 到 Spring BOOT的简化之路

从Servlet技术到Spring和Spring MVC,开发Web应用变得越来越简捷。但是Spring和Spring MVC的众多配置有时却让人望而却步,相信...

11640
来自专栏高性能服务器开发

如何招到一个靠谱的程序员

我的上一份工作是在一家世界500强金融集团担任架构师,当时,公司的IT团队规模将近2000人。与其他IT公司一样,程序员的流动性也比较高,而作为架构师,我需要为...

17420
来自专栏SpringBoot

jTable插件辅助资料

==============================================jTable插件========...

16040
来自专栏JavaEdge

Shiro 实战(四) - 过滤器机制1 简介2 过滤器链

NameableFilter给Filter起个名字,如果没有设置默认就是FilterName 当我们组装拦截器链时会根据这个名字找到相应的拦截器实例

40610
来自专栏王二麻子IT技术交流园地

《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

到目前为止我们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并可以自己写一个配置方式开发的小Demo了。今天我们来...

20820
来自专栏好好学java的技术栈

spring Aop实现身份验证和springboot异常统一处理

一般,如果用户没有登录的话,用户只可以查看商品,但是其他的,比如支付等是不能够进行操作的,这个时候,我们就需要用到用户拦截, 或者说身份验证了。

40210
来自专栏芋道源码1024

深入分析 Session 和 Cookie

在Web发展史中,我们知道浏览器与服务器间采用的是http协议,而这种协议是无状态的,所以这就导致了服务器无法知道是谁在浏览网页,但很明显,一些网页需要知道用户...

16920

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励