了解spring-webflux之前,我们要先了解一个词Reactive Streams ,是一套反应式编程 标准 和 规范,
Reactive Streams 由以下几个组件组成:

  • 发布者:发布元素到订阅者
  • 订阅者:消费元素
  • 订阅:在发布者中,订阅被创建时,将与订阅者共享
  • 处理器:发布者与订阅者之间处理数据

其主要的接口有这三个:

 -  Publisher-  Subscriber-  Subcription
  • 被订阅者 (Publisher) 主动推送数据给 订阅者 (Subscriber),触发 onNext() 方法。异常和完成时触发另外两个方法。
  • 被订阅者 (Publisher) 发生异常,则触发 订阅者 (Subscriber) 的 onError() 方法进行异常捕获处理。
  • 被订阅者 (Publisher) 每次推送都会触发一次 onNext() 方法。所有的推送完成且无异常时,onCompleted()方法将 在最后 触发一次。

如果 Publisher 发布消息太快了,超过了 Subscriber 的处理速度,那怎么办?这就是 Backpressure 的由来。Reactive Programming 框架需要提供 背压机制,使得 Subscriber 能够控制 消费消息 的速度
其中,Subcriber 中便包含了上面表格提到的 onNext、onError、onCompleted 这三个方法。对于 Reactive Streams,只需要理解其思想就可以,包括基本思想以及 Backpressure 等思想即可。
基于此规范,有一些的实现,比如

  1. Reactor 是基于 Reactive Streams 一套 反应式编程框架(spring子项目)
  2. RxJava,RxJava虽然是java ractive编程的领路人,并且RxJava跟Project Reactor 3.0 基本是等价的。但是考虑到Spring生态的强大,估计其前途不会太光明了。
  3. JDK9中Reactive Stream的实现规范 通常被称为 Flow API ,通过java.util.concurrent.Flow 和java.util.concurrent.SubmissionPublisher
    类来实现响应式流

WebFlux是spring5以 Reactor 为基础,实现 Web 领域的 反应式编程框架。使用webflux之前,我们先了解Reactor。

Reactor

Reactor 框架主要有两个主要的模块:

  • reactor-core
  • reactor-netty

前者主要负责 Reactive Programming 相关的 核心 API 的实现,后者负责 高性能网络通信 的实现,目前是基于 Netty 实现的。
在 Reactor 中,经常使用的类并不是很多,主要有以下两个:

  • Mono

实现了 org.reactivestreams.Publisher 接口,代表 0 到 1 个元素的 发布者。

  • Flux

同样实现了 org.reactivestreams.Publisher 接口,代表 0 到 N 个元素的发表者。

  • Scheduler

代表背后驱动反应式流的调度器,通常由各种线程池实现。

我们用reactorApi写下小样例

Mono<String> mono= Mono.just("mono");//发布一个字符串
mono.subscribe(a-> System.out.println(a));//消费一个字符串
Flux<String> fluxs= Flux.just("flux1", "flux2");//发布多个字符串
fluxs.subscribe(a-> System.out.println(a));//消费多个字符串

我们还可以用flux做来一个流式计算

        //同步Flux.just(1,2,3,4,5).log().map(i->{try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}return i*10;}).subscribe(c->log.info("结果:{}",c));

其中的sbcribe就是对flux(发布者的)的订阅消费

webflux

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>

引入此依赖,包含了

  • reactor-core
  • reactor-netty
    @GetMapping("/mono")public Mono<User> monoTest() {return Mono.just(new User());}

return时,webflux框架会实现订阅,并将数据返回给调用者相关逻辑,因此使用起来和springmvc没有区别。
但是其内部运行逻辑和mvc有根本区别,webflux要求服务器是基于异步线程模型,比如netty或者servlet3.1+。
在配合netty使用时,

NettyServer的Boss Group线程池内的事件循环会接收这个请求,然后把完成TCP三次握手的连接channel交给WorkerGroup中的某一个事件循环线程组(eventLoop)来进行处理(channelread,该事件处理线程会调用对应的controller进行处理),发布数据时会通过回调触发eventLoop中的事件,所以WebFlux的handler执行是使用Netty的IO线程进行执行的,所以需要注意如果handler的执行比较耗时,会把IO线程耗尽导致不能再处理其他请求,可以通过Reactor的publishOn操作符切换到其他线程池中执行。

适用场景

使用 Spring WebFlux,下游使用的安全认证层、数据访问层框架都必须使用 Reactive API 保证上下游都是匹配的,非阻塞的。然而Spring Data Reactive Repositories 目前只支持 MongoDB、Redis 和Couchbase 等几种不支持事务管理的 NOSQL,技术选型时需要权衡利弊和风险。

Spring MVC能满足场景的,就不需要更改为 Spring WebFlux,毕竟Reactive写法对比原本同步执行的程序写法很不同,而且很多基于Servlet线程模型的库将无法使用,如Spring Transaction……。
需要底层容器的支持(Netty和Servlet3.1+)。
适合应用在 IO 密集型的服务中(IO 密集型包括:磁盘IO密集型, 网络IO密集型),微服务网关就属于网络 IO 密集型,使用异步非阻塞式编程模型,能够显著地提升网关对下游服务转发的吞吐量。

spring-webflux理解相关推荐

  1. 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux

    作者:李新杰 来自:编程新说 情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用 ...

  2. 在Spring WebFlux中创建多个RouterFunction

    在这篇文章中,我们将研究在Spring WebFlux中为不同的逻辑域定义多个路由器功能. 如果您正在创建"微服务",则可能不会出现问题,因为您很可能仅在每个服务的单个域中工作,但 ...

  3. 使用Spring WebFlux进行操作

    Spring Boot 2.0最近在GA上线了,所以我决定在相当长一段时间内写我的第一篇有关Spring的文章. 自发布以来,我已经看到越来越多的提到Spring WebFlux以​​及有关如何使用它 ...

  4. Spring Web-Flux – Cassandra后端的功能样式

    在上一篇文章中,我介绍了Spring Web-Flux的基础知识,它表示Spring框架的Web层中的响应式支持. 我已经展示了使用Spring Data Cassandra并在Spring Web ...

  5. java中spring的web支持nio,Spring WebClient NIO功能和问题域,与Spring Webflux一起使用

    我正在使用最新版本的Spring - Spring 5 . 我正在开发http客户端的WebService"聚合器",有点像路由请求到外部WebServices,接收响应后接收响应 ...

  6. SpringBoot2.0使用Spring WebFlux之HelloWord篇

    SpringBoot2.0使用Spring WebFlux之HelloWord篇 Reactive Programming和Reactive Streams 以及 Spring Webflux 介绍 ...

  7. 快速上手Spring WebFlux框架

    一.前言 本文主要介绍基于SpringBoot如何快速上手使用SpringFlux框架开发WEB网站. Spring 5.0在原有的Spring MVC Stack(又称Servlet Stack)以 ...

  8. Spring Webflux 响应式编程 (二) - WebFlux编程实战

    第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream,也就是flow.其实和jdk8的stream没有一点关系.说白了就一个发布-订阅模式,一共只有4 ...

  9. 响应式编程之Spring Webflux

    文章目录 一 .响应式编程 二 .响应式流 (1)JDK9响应式流: (2)Reactor响应式流库 三.Spring WebFlux 1.整合Webflux 2.事件推送 3.实现背压 四.配置数据 ...

  10. 响应式Spring的道法术器(Spring WebFlux 教程)

    Spring WebFlux 2小时快速入门 Spring 5 之使用Spring WebFlux开发响应式应用. lambda与函数式(15min) Reactor 3 响应式编程库(60min) ...

最新文章

  1. 16000亿!谷歌发布人类历史首个万亿级模型 Switch Transformer,中国还有机会赶超吗?...
  2. 浅述Oracle分布式事务概念
  3. 文字或者图片连续滚动
  4. 一:redis 的string类型 - 相关操作
  5. pixhawk px4 commander.cpp
  6. java初始化数据报_java – 如何在Docker中初始化数据库后启动flyway
  7. Discuz!客户端api开发(一)
  8. T-SQL DATEPART() Functions
  9. 邮箱可以群发邮件吗?邮件群发怎么发?推荐邮箱邮件群发平台
  10. 《python深度学习》笔记(八):回归问题
  11. js中 英文中文混合排序
  12. IDEA 在debug 模式下启动tomcat报错:Application Server was not ..reason:Unable to ping server at localhos:1199
  13. 1062: [NOI2008]糖果雨 - BZOJ
  14. 获取硬盘的smart信息
  15. 深度模型框架(持续更新)
  16. 英伟达RTX 4070 Ti显卡正式发布!你会买吗?
  17. 计算机网络水晶头博客,两台电脑组成局域网(交叉线)的水晶头制作详解
  18. CIO40:企业信息化为什么要进行顶层设计?
  19. Acwing 265. 营业额统计
  20. LaTeX入门学习9(tikz基础-01)

热门文章

  1. 领先大厂股价大跌,半导体行业形势不妙
  2. 浴室预约微信小程序的设计与实现
  3. Powershell 数字转大写中文,数字金额转中文繁体(改自C#)
  4. 【Ant Design】图标大全(网断专用)
  5. 小丸子学Hadoop系列之——部署Hbase集群
  6. 【011】疫苗接种管理系统
  7. 武大计算机专业薪酬,2018大学毕业生薪酬排行榜公布:武大输给华科,更意想不到的高校是它...
  8. nvcc编译器之编译内幕(chapter 23)
  9. 如何构建一个基于IEC61499 的“云化PLC“
  10. 错误使用 load ASCII 文件的行号 1 中的文本未知“MATLAB“。