响应式编程_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
相关推荐
IT·陈寒1 小时前
怎么这么多 StringUtils —— Apache、Spring、Hutool 全面对比
java·spring·apache
青鱼入云1 小时前
【面试场景题】spring应用启动时出现内存溢出怎么排查
spring·面试·职场和发展
杨杨杨大侠5 小时前
实战案例:商品详情页数据聚合服务的技术实现
java·spring·github
杨杨杨大侠5 小时前
实战案例:保险理赔线上审核系统的技术实现
java·spring·github
FrankYoou19 小时前
Spring Boot + Spring MVC 项目结构
spring boot·spring·springmvc
zzywxc78721 小时前
AI行业应用:金融、医疗、教育、制造业的落地案例全解析
人工智能·深度学习·spring·机器学习·金融·数据挖掘
来一杯龙舌兰1 天前
【Sharding-JDBC】Spring/Spring Boot 集成 Sharding-JDBC,分表策略与 API、YAML 配置实践
java·spring boot·spring
on the way 1231 天前
Spring WebFlux 流式数据拉取与推送的实现
java·后端·spring
上官浩仁1 天前
springboot knife4j 接口文档入门与实战
java·spring boot·spring
optimistic_chen1 天前
【Java EE进阶 --- SpringBoot】Spring IoC
spring boot·后端·spring·java-ee·mvc·loc