本文,我们来谈谈呼应式编程。

什么是呼应式编程?

呼应式编程是一种编写异步、非堵塞、根据事情驱动的应用程序的编码模式

呼应式编程旨在进步应用程序的功能和可伸缩性,以应对高并发和高负载的场景

在传统的恳求呼应模型中,每个客户端恳求会分配一个线程,这些线程会一直等待直到恳求完结,这可能导致资源的浪费和功能瓶颈。呼应式编程使用异步非堵塞的方法,经过订阅和处理事情流来处理恳求。

什么是 WebFlux

Spring Boot 中选用的是呼应式编程模型为 Spring WebFlux

WebFlux 是一个呼应式的 Web 框架WebFlex 能够在资源有限的情况下进步体系的吞吐量和伸缩性(不是进步功能)。

比较 MVC 和 WebFlux

Spring MVC 选用命令编程的方法,代码被一句句执行,便利开发者理解与调试代码。 WebFlux 则是根据异步呼应式编程。

它们在作业方法上的区别:

MVC 作业方法

MVC 的作业流程是:主线程接收到恳求 -> 预备数据 -> 回来数据

整个作业流程是单线程堵塞,用户会感觉等待时间长。由于在成果处理之后才回来数据给浏览器。假如恳求许多,则吞吐量跟不上去。

WebFlux 作业方法

WebFlux 的作业流程是:主线程接收到恳求 -> 当即回来数据和函数的组合(Mono 或 Flux,不是成果) -> 敞开一个新 Work 线程去做实践的数据预备作业,进行真正的事务操作 -> Work 线程完结作业 -> 回来给用户实在的数据(成果)

这种方法给人的感觉就是呼应时间很短,由于回来的是不变的常数,它不跟着用户数量的添加而改变。

其他区别比照

比照项 Spring MVC Spring WebFlux
地址(路由)映射 @Controller@RequestMapping 等标准的 Spring MVC 注解 1. Router Functions,提供一套函数式风格的 API,用于创立 RouterHandlerFilter 2. @Controller@RequestMapping 等标准的 Spring MVC
数据流 Serlet API Reactive Streams:一种支撑背压的异步数据流处理标准,干流完成有 RxJavaReactorSpring WebFlux 默认集成的是 Reactor
容器 TomcatJettyUndertow NettyTomcatJettyUndertow
I/O 模式 同步堵塞的 I/O 模式 异步非堵塞的 I/O 模式
吞吐功能
事务处理能力 相同 相同
支撑数据库 NoSQLSQL 支撑 noSQL,不支撑 MySQL 等关系型数据库
恳求和呼应 HttpServletRequestHttpServeletResponse ServerRequestServerResponse

Spring WebFlux 支撑 noSQL,不支撑 MySQL 等关系型数据库。这有点尴尬

响应式编程

参阅

  • 《Spring Boot 实战派》