
关注我们,了解更多精彩课程

在本文中,我们将讨论Spring 5为反应性和异步并发模型提供的不同选择。我坚信,在我们拥抱新事物之前,我们应该意识到选择之间的差异,以及它与我们已经在做的事情之间的联系。让我们尝试找出在Spring 5中提供两个不同的非阻塞堆栈的原因。

基本上,Spring 5为异步和非阻塞方式提供了以下两个堆栈:
1. SpringMVC(ServletStack)
2. SpringWebFlux(反应性堆栈)
SpringMVC(ServletStack)
通过Servlet3.1的引入,SpringMVC可以实现非阻塞行为.但是,由于ServletAPI包含了几个仍处于阻塞状态的接口(可能是因为对向后兼容性的支持),所以总是有可能意外地在应用程序中使用阻塞API,这是为了开发成非阻塞的。在这种情况下,阻塞API的使用迟早会使应用程序崩溃。让我们用下面的代码片段来讨论这样的场景:

为了在SpringMVC上下文中解释上述代码,使用容器管理错误页面是阻塞的。让我们看看我的GitHub储存库.

每当Spring应用程序中发生错误时,容器将调用 /error页面,而“myError”页面将以阻塞方式呈现。当然,我们有办法处理这些事情,但它们绝对容易出错。总之,这很容易出错,因为应用程序可以访问servlet对象,servlet对象具有阻塞操作和非阻塞操作
因此,即使我们在Spring5MVC中有方法来编写完全非阻塞的代码,人们仍然认为需要有一个堆栈,在这个堆栈中不可能使用底层的阻塞API。这意味着ServletAPI不直接公开给应用程序。这迫使我们合并Spring反应堆栈,即SpringWebFlux。
2
SpringWebFlux(反应性堆栈)
SpringWebFlux是一个完全非阻塞的反应性框架,它确实与SpringMVC中的不同。那么,在SpringWebFlux中不阻塞需要什么呢?
· 事件循环在核心。
· 事件驱动架构,消息传递
· 通过反应性流api组合异步逻辑的方法
· 背压
SpringWebFlux并不直接使用servlet。相反,它使用SpringWebAPI,其中包括反应堆流。
本系列的目的是servlet/Spring从阻塞到非阻塞范式的发展。我不想在本教程中详细介绍SpringWebFlux。但是,我还是要介绍一个使用SpringWebFlux的SpringBoot应用程序示例。我们应该注意的一点是SpringWebFlux与Servlet容器无关。SpringWebflow工作在Servlet容器上,也可以通过反应堆Netty项目在Netty上工作。
在我的Spring引导应用程序中,我依赖WebFlux作为Spring启动程序,并且在服务器启动时,它说应用程序已经准备好使用Netty了。

在同一个应用程序中,如果我们对Spring-boot-start-web使用依赖关系,那么日志将被打印出来,如下所示:

因此,无需任何代码更改,我们就可以将SpringWebFlux应用程序作为SpringMVC应用程序运行。但是,反之亦然,因为SpringMVC应用程序可以使用HttpServletRequest/Response,它在SpringWebFlux运行时中不可用。
我已经创建了与我们在其中使用的相同类型的服务。

我想让读者比较一下这个api和asyncNonBlockingRequestProcessing API,因为两者都使用非阻塞范式,但是底层堆栈对于两个API都是不同的。
感谢你阅读我的文章,我希望它有助于理解Spring/servlet上下文中的反应性。


不关注

就捣蛋

长按上方二维码,关注“Java高级部落”

点击阅读原文,了解更多精彩内容