Spring之WebFlux

Posted 技术原始积累

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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线程池中线程并没具体处理请求,而仅仅是转发。 这时候的请求模型如下Spring之WebFlux

四、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之WebFlux的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码窥探之:Spring IOC之@Value

风暴之Spring事务

我们一起学习Spring之Spring简介

Spring系列之手写一个SpringMVC

一文彻底解密Spring 源码之Spring MVC

java之spring之helloword