WebFlux和Spring MVC比较

4,135 阅读2分钟

Spring WebFlux 和 Spring MVC

什么是WebFlux

  • 是一个异步非阻塞的Web框架,它能够充分利用多核CPU的硬件资源去处理大量的并发请求
  • 优势:内部使用的是响应式编程,以Reactor库为基础,基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。
  • 不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性

应用场景

  • 特别适合在IO密集型的服务中,比如微服务网关。
  • PS: IO 密集型包括:磁盘IO密集型, 网络IO密集型,微服务网关就属于网络 IO 密集型,使用异步非阻塞式编程模型,能够显著地提升网关对下游服务转发的吞吐量。

选WebFlux还是Spring MVC

  • WebFlux不是 Spring MVC的替代方案!虽然 WebFlux 也可以被运行在 Servlet 容器上(需是 Servlet 3.1+ 以上的容器),但是 WebFlux 主要还是应用在异步非阻塞编程模型,而 Spring MVC 是同步阻塞的,如果你目前在 Spring MVC 框架中大量使用非同步方案,那么,WebFlux 才是你想要的,否则,使用 Spring MVC 才是你的首选。

  • 在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如已经提到的,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。

异同点

image-20191231142434301
异同点

注意点:

  • Spring MVC 因为是使用的同步阻塞式,更方便开发人员编写功能代码,Debug 测试等,一般来说,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux;
  • WebFlux 默认情况下使用 Netty 作为服务器;
  • 主流的数据库基本都可以了,目前已有项目支持mysql,https://r2dbc.io/ (要谨慎使用,毕竟r2dbc也还是实验性的);

WebFlux如何分发

  • springmvc 是通过DispatcherServlet,而WebFlux是DispatcherHandler,它实现了WebHandler接口:
img
webHandler
img
handle
  • ①:ServerWebExchange 对象中放置每一次 HTTP 请求响应信息,包括参数等;
  • ②:判断整个接口映射 mappings 集合是否为空,空则创建一个 Not Found 的错误;
  • ③:根据具体的请求地址获取对应的 handlerMapping;
  • ④:调用具体业务方法,也就是我们定义的接口方法;
  • ⑤:处理返回的结果;