您的位置:首页 > 编程语言 > Java开发

Spring之WebFlux

2019-05-23 07:59 162 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37055174/article/details/99956502

一、前言

在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模式中业务线程池中每个线程只能同时处理一个请求的读写事件)。这时候模型为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: