WebFlux官网
Spring Framework 中包含的原始 Web 框架 Spring Web MVC 是专门为 Servlet API 和 Servlet 容器构建的。反应式堆栈 Web 框架 Spring WebFlux 是在 5.0 版的后期添加的。它是完全非阻塞的,支持反应式流(Reactive Stream)背压,并在Netty、Undertow和Servlet 3.1 +容器等服务器上运行。
Spring WebFlux 是一个异步非阻塞式 IO 模型,通过少量的容器线程就可以支撑大量的并发访问。底层使用的是 Netty 容器,这点也和传统的 SpringMVC 不一样,SpringMVC 是基于 Servlet 的。但是接口的响应时间并不会因为使用了 WebFlux 而缩短,服务端的处理结果还是得由 worker 线程处理完成之后再返回给前端。
-
【spring-webmvc + Servlet + Tomcat】命令式的、同步阻塞的
-
【spring-webflux + Reactor + Netty】响应式的、异步非阻塞的
同时要学习 时我发现又需要 Java 8 中的函数式编程、Stream 流等技术作为前置知识,对于lambda和stream流,可以参考:https://blog.csdn.net/lemon_TT/article/details/119415154
2.1 Reactive Stream
反应式编程(Reactive Programming) ,这是微软为了应对高并发环境下的服务端编程,提出的一个实现异步编程的方案。
反应式流(Reactive Stream) 就是反应式编程相关的规范,在 Java 平台上,由Netflix(开发了 RxJava)、TypeSafe(开发了 Scala、Akka)、Pivatol(开发了 Spring、Reactor)共同制定。
它由以下几个组件组成:
-
发布者:发布元素到订阅者
-
订阅者:消费元素
-
订阅:在发布者中,订阅被创建时,将与订阅者共享
-
处理器:发布者与订阅者之间处理数据
比如Java 平台直到 JDK 9才提供了对于Reactive的完整支持,JDK9也定义了上述提到的四个接口,在包上
2.2 Reactor
Reactive Stream 是一套反应式编程的规范,但作为应用程序 API,应用程序肯定还是需要一个更高级、更丰富的功能 API 来编写异步逻辑。这就是反应式库所扮演的角色。
Reactor 框架是 Pivotal 基于 思想实现的。它符合 规范。它提供了和 类型,通过一组与 ReactiveX 运算符词汇表一致的丰富运算符来处理 0…1 () 和 0…N ()的数据序列。是一个用于 JVM 的完全非阻塞的响应式编程框架,具备高效的需求管理,可以很好的处理 “backpressure”。**Reactor **就是 Spring WebFlux 的首选 反应式库。
Flux 和 Mono 这两个 Reactor 的核心类,两个都是发布者 Publisher。
-
Mono:实现发布者 Publisher,并返回 0 或 1 个元素。
-
Flux:实现发布者 Publisher,并返回 N 个元素。
2.3 Reactive Stream、Reactor 和 WebFlux 关系
-
Reactive Stream 是一套反应式编程标准和规范;
-
Reactor 是基于 Reactive Streams 一套反应式编程框架;
-
WebFlux 以 Reactor 为基础,实现 Web 领域的 反应式编程框架。
经过上面的基础,我们现在已经能够得出一些结论的了:
-
WebFlux是Spring推出响应式编程的一部分(web端)
-
响应式编程是异步非阻塞的(是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式)
Spring官方为了让我们更加快速/平滑到WebFlux上,之前SpringMVC那套都是支持的。也就是说:我们可以像使用SpringMVC一样使用着WebFlux。WebFlux使用的响应式流并不是用JDK9平台的,而是一个叫做Reactor响应式流库。Reactor是一个响应式流,它也有对应的发布者( ),Reactor的发布者用两个类来表示:
-
Mono(返回0或1个元素)
-
Flux(返回0 - n个元素)
而消费者则是Spring框架帮我们去完成
首先创建项目,在引入相关依赖,也可以在常见时勾选
新建文件
对于前两个方法来说,从调用者(浏览器)的角度而言,是感知不到有什么变化的,因为都是得等待5s才返回数据。但是,从服务端的日志我们可以看出,WebFlux是直接返回Mono对象的(而不是像SpringMVC一直同步阻塞5s,线程才返回)。这正是WebFlux的好处:能够以固定的线程来处理高并发(充分发挥机器的性能)。
第三个方法是WebFlux支持服务器推送(SSE - >Server Send Event),即从服务器推送到客户端。
Spring Boot 2.3.0.RELEASE 开始才正式支持基于 R2DBC 的 MySQL 驱动。
R2DBC: R2DBC 是 Spring 官方在 Spring5 发布了响应式 Web 框架 Spring WebFlux 之后急需能够满足异步响应的数据库交互 API,不过由于缺乏标准和驱动,Pivotal 团队开始自己研究响应式关系型数据库连接 Reactive Relational Database Connectivity,并提出了 R2DBC 规范 API 用来评估可行性并讨论数据库厂商是否有兴趣支持响应式的异步非阻塞驱动程序。最早只有 PostgreSQL 、H2、MSSQL 三家数据库厂商,现在 MySQL也加入进来了。
2.1 引入依赖与配置
yml配置连接
2.2 创建数据表
2.3 创建相关类
实体类
,就相当于 DAO
3.1 基于注解的方式
3.2 基于Functional Endpoints方式
-
这个配置类的作用有点像 中的 ,负责请求的分发,根据不同的请求 URL,找到对应的处理器去处理。
-
通过 这样一个工具类来创建 实例。
-
首先调用 nest 方法,第一个参数配置的相当于是接下来配置的地址的一个前缀,这有点类似于我们在 Controller 类上直接写 @注解去配置地址。
-
方法的第二个参数就是 实例了,每一个 实例通过 方法来构建,它的第一个参数就是请求的 URL 地址(注意这个时候配置的地址都是有一个共同的前缀),第二个参数我们通过方法引用的方式配置了一个 ,这个就是当前请求的处理器了。
-
通过 方法可以配置多个路由策略。
创建
创建
-
如果原先使用用SpringMVC好好的话,则没必要迁移。因为命令式编程是编写、理解和调试代码的最简单方法。因为老项目的类库与代码都是基于阻塞式的。
-
如果你的团队打算使用非阻塞式web框架,WebFlux确实是一个可考虑的技术路线,而且它支持类似于SpringMvc的Annotation的方式实现编程模式,也可以在微服务架构中让WebMvc与WebFlux共用Controller,切换使用的成本相当小。
-
在SpringMVC项目里如果需要调用远程服务的话,你不妨考虑一下使用WebClient,而且方法的返回值可以考虑使用Reactive Type类型的,当每个调用的延迟时间越长,或者调用之间的相互依赖程度越高,其好处就越大。
-
在微服务架构中,您可以混合使用Spring MVC或Spring WebFlux控制器或Spring WebFlux功能端点的应用程序。在两个框架中支持相同的基于注释的编程模型,可以更轻松地重用知识,同时为正确的工作选择正确的工具。
并不是让你的程序运行的更快(相对于SpringMVC来说),而是在有限的资源下提高系统的伸缩性,因此当你对响应式编程非常熟练的情况下并将其应用于新的系统中,还是值得考虑的,否则还是老老实实的使用WebMVC。
参考文献
外行人都能看懂的WebFlux
WebFlux 详解
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/15914.html