响应式编程_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
相关推荐
添砖Java中44 分钟前
深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
java·数据库·spring boot·spring·缓存·双写一致性
天上掉下来个程小白1 小时前
添加购物车-02.代码开发
java·服务器·前端·后端·spring·微信小程序·苍穹外卖
*.✧屠苏隐遥(ノ◕ヮ◕)ノ*.✧11 小时前
MyBatis快速入门——实操
java·spring boot·spring·intellij-idea·mybatis·intellij idea
bing_15813 小时前
Spring MVC 中Model, ModelMap, ModelAndView 之间有什么关系和区别?
java·spring·mvc
ABdolphin14 小时前
Spring-博客系统项目
数据库·sql·spring
Android 小码峰啊16 小时前
Android Compose 框架物理动画之捕捉动画深入剖析(29)
android·spring
Rubypyrrha17 小时前
Spring MVC常见注解详解
java·spring·mvc
计算机学姐18 小时前
基于SpringBoot的在线教育管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
Minyy1118 小时前
“爱生活”小项目问题总结
java·数据库·spring boot·spring·maven·intellij-idea
有梦想的攻城狮19 小时前
spring中的@Value注解详解
java·后端·spring·value注解