响应式编程_04Spring 5 中的响应式编程技术栈_WebFlux 和 Spring Data Reactive

文章目录

  • 概述
  • [响应式Web框架Spring WebFlux](#响应式Web框架Spring WebFlux)
  • [响应式数据访问Spring Data Reactive](#响应式数据访问Spring Data Reactive)

概述

https://spring.io/reactive

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。

上图针对传统 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
相关推荐
zb200641202 小时前
CVE-2024-38819:Spring 框架路径遍历 PoC 漏洞复现
java·后端·spring
2401_895521342 小时前
spring-ai 下载不了依赖spring-ai-openai-spring-boot-starter
java·人工智能·spring
二进制person4 小时前
JavaEE进阶 --Spring Framework、Spring Boot和Spring Web MVC(2)
spring boot·spring·java-ee
小胖java5 小时前
高校培养方案制定系统
java·spring
常利兵5 小时前
Spring项目新姿势:Lambda封装Service调用,告别繁琐注入!
java·数据库·spring
禾小西7 小时前
Spring AI :Spring AI的介绍
java·人工智能·spring
星辰_mya8 小时前
InnoDB的“身体结构”:页、Buffer Pool与Redo Log的底层奥秘
数据库·mysql·spring·面试·系统架构
代码探秘者10 小时前
【算法】吃透18种Java 算法快速读写模板
数据结构·数据库·python·算法·spring
空空潍10 小时前
Spring AI 实战系列(三):多模型共存+双版本流式输出
java·人工智能·spring
pupudawang10 小时前
Spring EL 表达式的简单介绍和使用
java·后端·spring