首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring之WebFlux

Spring之WebFlux

作者头像
加多
发布2018-12-05 11:47:26
1.8K0
发布2018-12-05 11:47:26
举报
文章被收录于专栏:Java编程技术Java编程技术

一、前言

在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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、 阻塞Servlet
  • 三、非阻塞Servlet
  • 四、WebFlux
  • 最后 Java并发编程之美欢迎订购
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档