1. 首页 > 快讯

想了解WebFlux?先把异步Servlet搞明白

[[403236]]

我们日常使用的SpringMVC基本都不是异步Servlet,但是学习WebFlux,异步Servlet是基础,所以宋哥还是花点时间和大家聊聊什么是异步Servlet,这样可以帮助大家理解为什么需要WebFlux。

1.什么是异步 Servlet

我们先来说一下什么是非异步Servlet。

在Servlet3.0之前,Servlet采用Thread-Per-Request方式处理Http请求,即每个请求从头到尾都由某个线程处理。

如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其对应的线程会同步等待IO操作完成,而IO操作是非常慢的,所以此时线程无法及时处理。释放回线程池供后续使用。如果并发量很大,肯定会造成性能问题。

SpringMVC等传统MVC框架无法摆脱Servlet的束缚。原因很简单。它们都是基于Servlet实现的。

为了解决这个问题,在Servlet3.0中引入了异步Servlet,然后在Servlet3.1中引入了非阻塞IO,进一步增强了异步处理的性能。

在正式推出WebFlux之前,我们先来了解一下异步Servlet的一些基本玩法。

2.版本关系

我们首先需要看一下Servlet和Tomcat之间的对应关系。毕竟,如果使用错误的Tomcat 版本,异步Servlet 可能不受支持。

下图来自Tomcat官网(http://tomcat.apache.org/whichversion.html):

从上图我们可以看到Servlet3.0对应的Tomcat版本是7.0.x,Servlet3.1对应的Tomcat版本是8.0.x。

也就是说,如果我们要使用异步Servlet,Tomcat至少必须是7.0以上版本;如果你也想体验非阻塞IO,那么Tomcat至少必须是8.0以上。

对于下一种情况,请记住选择您本地的Tomcat 版本。

3.基本玩法

我们先看一个熟悉的同步Servlet:

@WebServlet(urlPatterns='/sync')publicclassSyncServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{doGet(请求,响应);}@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletRes) ponseresponse) throwsServletException,IOException{longstart=System.currentTimeMillis(); printLog(request,response);System.out.println('总耗时:'+(System.currentTimeMillis()-start));}privatevoidprintLog(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException{try{Thread.sleep(3000);} catch(InterruptedExceptione){e.printStackTrace();}response.getWriter().write('ok');}} 这个Servlet大家都很熟悉了。

前端请求到达后,我们调用printLog方法做一些处理,同时打印出doGet方法的执行时间。

在printLog中,我们先休息3秒,然后返回一个字符串给前端。

前端发送请求,最终doGet方法耗时3001毫秒。

这就是我们都知道的同步Servlet。在整个请求处理过程中,请求会占用Servlet线程,直到处理完一个请求才会释放该线程。

接下来我们稍微修改一下,将其变成异步Servlet。

有人可能会说,异步有什么难的呢?把printLog方法扔到子线程中执行不就可以了吗?但这又会带来另一个问题。子线程中没有办法直接通过HttpServletResponse返回数据,所以我们必须需要Servlet。异步支持。通过异步支持,可以在子线程中返回数据。

我们看一下修改后的代码:

@WebServlet(urlPatterns='/async',asyncSupported=true)publicclassAsyncServletextendsHttpServlet{@OverrideprotectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{doGet(请求,响应);}@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{longstart=系统。 currentTimeMillis();AsyncContextasyncContext=request.startAsync();CompletableFuture.runAsync(()-printLog(asyncContext,asyncContext.getRequest(),asyncContext.getResponse()));System.out.println('总耗时:'+ (System.currentTimeMillis()-start));}privatevoidprintLog(AsyncContextasyncContext,ServletRequestrequest,ServletResponseresponse){try{Thread.sleep(3000);response.getWriter().write('ok');asyncContext.complete();} catch(InterruptedException|IOExceptione){e.printStackTrace();}}}这里的改造主要包括以下几个方面:

将asyncSupported 属性添加到@WebServlet 注释以启用异步支持。调用request.startAsync();方法来启动异步上下文。 JDK8中通过CompletableFuture.runAsync方法启动一个子线程(当然你也可以自己创建一个新的子线程)。调用printLog 方法时的请求和响应是直接从asyncContext 中重构并获取的。请注意,这是[键]。在printLog 方法中,方法执行完成后,会调用asyncContext.complete() 方法来通知异步上下文请求已处理完毕。经过上述改造后,当前控制台打印所花费的总时间几乎可以忽略不计。

也就是说,有了异步Servlet,后台Servlet的线程就会被及时释放,释放后就可以接收新的请求,从而提高应用程序的并发能力。

刚接触异步Servlet的朋友可能会有一个误区,认为使用异步Servlet后,前端响应就会加快。这话怎么说呢?随着后端并发能力的提高,前端的响应速度自然会提高,但通过一两个简单的请求很难看到这种提升。

4.小结

OK,关于想了解WebFlux?先把异步Servlet搞明白和的内容到此结束了,希望对大家有所帮助。

用户评论

余温散尽ぺ

说得对啊, 基础都没有,怎么学习新的技术呢?

    有19位网友表示赞同!

我怕疼别碰我伤口

异步编程确实有点门槛,好多人还挣扎在同步老思想里

    有8位网友表示赞同!

服从

这个标题说的太扎心了。很多人都急着冲到高概念,却忽略了基本功的重要性。

    有5位网友表示赞同!

终究会走-

想学 WebFlux 还是要先有异步 Servlet 的基础,不然一头雾水啊

    有19位网友表示赞同!

沐晴つ

现在好多技术更新迭代太快了,后进者 really 有压力啊

    有8位网友表示赞同!

失心疯i

WebFlux 是个好东西,非阻塞的开发模式未来肯定越来越流行.

    有19位网友表示赞同!

蹂躏少女

学技术要循序渐进,夯实基础才能更快的进步

    有16位网友表示赞同!

微信名字

是啊,现在连 basic 的 Servlet 都看不懂,那 WebFlux 算啥?哈哈

    有14位网友表示赞同!

愁杀

基础知识很重要,就像建筑的基础一样,没有牢固的基础就无法建造高楼.

    有15位网友表示赞同!

红尘滚滚

我之前也觉得 WebFlux 很难懂,后来才发现是底层的异步编程我没弄明白

    有7位网友表示赞同!

权诈

希望更多人能重视基础学习,而不是一味追求高深的知识

    有10位网友表示赞同!

坏小子不坏

做技术工作需要扎实的功底,才能在快速发展的时代保持竞争力。

    有10位网友表示赞同!

醉枫染墨

我觉得异步 Servlet 值得好好学习一下,它对理解 WebFlux 有很大帮助!

    有12位网友表示赞同!

病态的妖孽

WebFlux 是未来 web 开发的趋势,学习它的人会有很大的优势

    有12位网友表示赞同!

见朕骑妓的时刻

很多技术都是建立在这基础之上的,只有掌握了基础才能领悟更高深的知识.

    有18位网友表示赞同!

堕落爱人!

是啊,现在好多项目就用 WebFlux 了,如果连 Servlet 都不懂,估计就会很吃力。

    有18位网友表示赞同!

拽年很骚

学习哪门技术的重点还是在于理解它的底层原理和工作机制

    有13位网友表示赞同!

来自火星的我

建议想学 WebFlux 的人先把异步 Servlet 搞明白,这样才能更顺利的学习.

    有19位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7537.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666