文章目录
- 概述
- [响应式Web框架Spring WebFlux](#响应式Web框架Spring WebFlux)
- [响应式数据访问Spring Data Reactive](#响应式数据访问Spring Data Reactive)
![](https://i-blog.csdnimg.cn/direct/afb3841453234c93bb75c25781ca126b.png)
概述
![](https://i-blog.csdnimg.cn/direct/7d05177f8bd74170a271e4c9e416f3f9.png)
2017 年,Spring 发布了新版本 Spring 5, Spring 5 引入了很多核心功能,这其中重要的就是全面拥抱了响应式编程的设计思想和实践。
Spring 5 的响应式编程模型以 Project Reactor
库为基础,而后者则实现了响应式流规范。事实上,Spring Boot 从 2.x 版本开始也是全面依赖 Spring 5。
针对响应式编程技术栈,有一点需要注意,即响应式编程并不是只针对系统中的某一部分组件,而是需要适用于调用链路上的所有组件。无论是 Web 层、服务层还是处于下游的数据访问层,只要有一个环节不是响应式的,那么这个环节就会出现同步阻塞,从而导致响应式编程_02基本概念:背压机制 Backpressure中所介绍的背压机制无法生效。这就是所谓的全栈式响应式编程的设计理念。
因此,Spring 5 也针对响应式编程构建了全栈式的开发组件。对于常见的应用程序而言,Web 服务层和数据访问层构成了最基本的请求链路。而 Spring 5 也提供了
- 针对 Web 服务层开发的响应式 Web 框架 WebFlux,
- 以及支持响应式数据访问的 Spring Data Reactive 框架
响应式Web框架Spring WebFlux
在 Spring Boot 的基础上,我们将引入全新的 Spring WebFlux 框架。WebFlux 框架名称中的 Flux 一词就来源于 Project Reactor 框架中的 Flux 组件。
WebFlux 功能非常强大,不仅包含了对创建和访问响应式 HTTP 端点的支持,还可以用来实现服务器推送事件以及 WebSocket。
![](https://i-blog.csdnimg.cn/direct/494707c13eb04245a53a0b43ee1b1bf2.png)
上图针对传统 spring-webmvc
技术栈和新型的 spring-webflux
技术栈做了一个对比。
我们从上往下看
-
位于最上层所提供的实际上是面向开发人员的开发模式,注意左上部分两者存在一个交集,即
Spring WebFlux
既支持基于@Controller、@RequestMapping
等注解的传统开发模式,又支持基于Router Functions
的函数式开发模式 -
关于框架背后的实现原理,传统的 Spring MVC 构建在 Java EE 的 Servlet 标准之上,该标准本身就是阻塞和同步的。在最新版本的 Servlet 中虽然也添加了异步支持,但是在等待请求的过程中,Servlet 仍然在线程池中保持着线程。而 Spring WebFlux 则是构建在响应式流以及它的实现框架 Reactor 的基础之上的一个开发框架,因此可以基于 HTTP 协议用来构建异步非阻塞的 Web 服务
-
最后,看一下位于底部的容器支持。显然,Spring MVC 是运行在传统的 Servlet 容器之上,而 Spring WebFlux 则需要支持异步的运行环境,比如
Netty、Undertow
以及Servlet 3.1
版本以上的Tomcat 和 Jetty
,因为在 Servlet 3.1 中引入了异步 I/O 支持
由于 WebFlux
提供了异步非阻塞的 I/O 特性,因此非常适合用来开发 I/O 密集型服务。而在使用 Spring MVC 就能满足的场景下,就不需要更改为 WebFlux。通常,不大建议你将 WebFlux 和 Spring MVC 混合使用,因为这种开发方式显然无法保证全栈式的响应式流。
响应式数据访问Spring Data Reactive
Spring Data 是 Spring 家族中专门针对数据访问而开发的一个框架,针对各种数据存储媒介抽象了一批 Repository 接口以简化开发过程。而在 Spring Data 的基础上,Spring 5 也全面提供了一组响应式数据访问模型。
在介绍如何使用 Spring Data 实现响应式数据访问模型之前,我们再来看一下关于 Spring Boot 2 的另一张官网架构图
可以看到,上图底部明确把 Spring Data 划分为两大类型,
- 一类是支持 JDBC、JPA 和部分 NoSQL 的传统 Spring Data Repository,
- 而另一类则是支持
Mongo、Cassandra、Redis、Couchbase
等的响应式Spring Data Reactive Repository
![](https://i-blog.csdnimg.cn/direct/ce06a994e1e1465e9116a08591e6f582.jpeg)