SpringBoot响应式编程教程-WebFlux
- 前言
- 正文
- 一、Reactor
- 1、核心概念
- 2、核心特性
- 二、Spring Webflux
- 与springmvc的组件对比
- 三、R2DBC
- 结语
前言
最近有个项目需要用到响应式编程,一开始还是很懵的,以为是网页的自适应,通过部分文章的学习,有了基本了解,但缺乏系统学习还是难以加以运用,因此对其进行了学习,并记录自认为比较重要的部分,推荐你直接看课程笔记,如下链接 #.#
本篇文章课程链接:尚硅谷SpringBoot响应式编程教程,2024最新springboot3入门到实战
课程笔记链接:https://www.yuque.com/leifengyang/springboot3/rg4wqgdbg8mfv04q
课程代码链接:https://gitee.com/leifengyang/reactor-programming.git
webflux官网地址:webflux官网地址
简单理解:
替代 SpringMvc,使用SpringWebFlux,SpringWebFlux使用的容器也不在是Tomcat,而是用的netty,与之相应的框架也需要支持响应式,mybatis、jdbc等不支持响应式就不能使用了。 好处:天然支持高并发,资源利用率很高,较低配置就能实现高的并发。
原来的阻塞式编程: 浏览器 --> Controller --> Service --> Dao
响应式编程:Dao(数据发布者) --> Service --> Controller --> 浏览器
学习前提: 需掌握 java8 lambda 表达式相关操作
正文
一、Reactor
官方介绍: Reactor 是一个用于JVM的完全非阻塞的响应式编程框架,具备高效的需求管理(即对 “背压(backpressure)”的控制)能力。它与 Java 8 函数式 API 直接集成,比如 CompletableFuture, Stream, 以及 Duration。它提供了异步序列 API Flux(用于[N]个元素)和 Mono(用于 [0|1]个元素),并完全遵循和实现了“响应式扩展规范”(Reactive Extensions Specification)。
Reactor 的 reactor-ipc 组件还支持非阻塞的进程间通信(inter-process communication, IPC)。 Reactor IPC 为 HTTP(包括 Websockets)、TCP 和 UDP 提供了支持背压的网络引擎,从而适合 应用于微服务架构。并且完整支持响应式编解码。
可以将其简单的理解为 MQ 操作,请求先放到队列,然后在依次处理。
历史背景: 在响应式编程方面,微软跨出了第一步,它在 .NET 生态中创建了响应式扩展库(Reactive Extensions library, Rx)。接着 RxJava 在JVM上实现了响应式编程。后来,在 JVM 平台出现了一套标准的响应式 编程规范,它定义了一系列标准接口和交互规范。并整合到 Java 9 中(使用 Flow 类)
1、核心概念
1、订阅:在订阅者(Subscriber)订阅(subscribe)到一个 发布者(Publisher)之前,什么都不会发生。
2、背压:请求进来,先放到队列,线程主动获取处理,当请求过多时,也不会崩溃。
3、热(Hot) vs 冷(Cold)
热(Hot):对于每一个 Subscriber,都会收到从头开始所有的数据。如果源头 生成了一个 HTTP 请求,对于每一个订阅都会创建一个新的 HTTP 请求。不管流多久产生,后来的订阅者也会获取到数据
冷(Cold):相反,只能获取订阅后的数据,之前的就丢失了,不过注意,有些“热”的响应式流可以缓存部分或全部历史数据,又相当于“冷”的响应式流。
2、核心特性
1、Mono和Flux
Mono:代表 0或1 个数据流
Flux: 代表N个数据流
举例:
Flux.just(1, 2, 0, 4).xxx
2、subscribe() 订阅
简单示例:
Flux.range(1,10) // 生成一个1-10的流.handle((value,sink)->{System.out.println("拿到的值:"+value);sink.next("张三:"+value); //可以向下发送数据的通道}).log() //日志.subscribe(); // 订阅,有了此操作,流才会真正执行,这里为空时,订阅的默认流,也可以订阅官方提供的订阅者或自定义订阅者// .subscribe(new BaseSubscriber<String>() {}); // 自己定义一个订阅者
3、流的取消:消费者调用 cancle() 取消流的订阅;
4、错误处理:调用 onErrorReturn()、onErrorResume() 等方法,对异常错误进行处理
5、常用操作:filter、flatMap、concatMap、flatMapMany、transform、defaultIfEmpty、switchIfEmpty、concat、concatWith、merge、mergeWith、mergeSequential、zip、zipWith…
二、Spring Webflux
与springmvc的组件对比
下图就很直观的展示了两者之间的差异和联系,其实在使用层面(注解),基本都是一样的,以前怎么样,现在还怎么用。
三、R2DBC
前面讲到,如果要使用响应式编程,那么我们在开发过程中使用的所有组件都得支持响应式,而我们原来使用的jdbc就是不行的,R2DBC 是 Reactive Relational Database Connectivity。
组件:
- R2dbcEntityTemplate 类似:jdbcTemplate
- DatabaseClient
最佳实践: 提升生产效率的做法
- Spring Data R2DBC,基础的CRUD用 R2dbcRepository 提供好了
- 自定义复杂的SQL(单表): @Query;
- 多表查询复杂结果集: DatabaseClient 自定义SQL及结果封装;
@Query + 自定义 Converter 实现结果封装
结语
学习完这次课程,对响应式有了更深的理解,但对比目前项目中的使用,感觉还差不少,还得查询相关资料学习,响应式编程目前也还停留在摸索阶段,很多公司都还没有使用,但这个技术还是很有前瞻性的,值得大家学习,提早进行知识储备,到时候好升职加薪呀!!!