spring-webflux理解
了解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 等思想即可。
基于此规范,有一些的实现,比如
- Reactor 是基于 Reactive Streams 一套 反应式编程框架(spring子项目)
- RxJava,RxJava虽然是java ractive编程的领路人,并且RxJava跟Project Reactor 3.0 基本是等价的。但是考虑到Spring生态的强大,估计其前途不会太光明了。
- 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理解相关推荐
- 爸爸又给Spring MVC生了个弟弟叫Spring WebFlux
作者:李新杰 来自:编程新说 情景引入 很早之前,Java就火起来了,是因为它善于开发和处理网络方面的应用. Java有一个爱好,就是喜欢制定规范标准,但自己又不善于去实现. 反倒是一些服务提供商使用 ...
- 在Spring WebFlux中创建多个RouterFunction
在这篇文章中,我们将研究在Spring WebFlux中为不同的逻辑域定义多个路由器功能. 如果您正在创建"微服务",则可能不会出现问题,因为您很可能仅在每个服务的单个域中工作,但 ...
- 使用Spring WebFlux进行操作
Spring Boot 2.0最近在GA上线了,所以我决定在相当长一段时间内写我的第一篇有关Spring的文章. 自发布以来,我已经看到越来越多的提到Spring WebFlux以及有关如何使用它 ...
- Spring Web-Flux – Cassandra后端的功能样式
在上一篇文章中,我介绍了Spring Web-Flux的基础知识,它表示Spring框架的Web层中的响应式支持. 我已经展示了使用Spring Data Cassandra并在Spring Web ...
- java中spring的web支持nio,Spring WebClient NIO功能和问题域,与Spring Webflux一起使用
我正在使用最新版本的Spring - Spring 5 . 我正在开发http客户端的WebService"聚合器",有点像路由请求到外部WebServices,接收响应后接收响应 ...
- SpringBoot2.0使用Spring WebFlux之HelloWord篇
SpringBoot2.0使用Spring WebFlux之HelloWord篇 Reactive Programming和Reactive Streams 以及 Spring Webflux 介绍 ...
- 快速上手Spring WebFlux框架
一.前言 本文主要介绍基于SpringBoot如何快速上手使用SpringFlux框架开发WEB网站. Spring 5.0在原有的Spring MVC Stack(又称Servlet Stack)以 ...
- Spring Webflux 响应式编程 (二) - WebFlux编程实战
第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream,也就是flow.其实和jdk8的stream没有一点关系.说白了就一个发布-订阅模式,一共只有4 ...
- 响应式编程之Spring Webflux
文章目录 一 .响应式编程 二 .响应式流 (1)JDK9响应式流: (2)Reactor响应式流库 三.Spring WebFlux 1.整合Webflux 2.事件推送 3.实现背压 四.配置数据 ...
- 响应式Spring的道法术器(Spring WebFlux 教程)
Spring WebFlux 2小时快速入门 Spring 5 之使用Spring WebFlux开发响应式应用. lambda与函数式(15min) Reactor 3 响应式编程库(60min) ...
最新文章
- 16000亿!谷歌发布人类历史首个万亿级模型 Switch Transformer,中国还有机会赶超吗?...
- 浅述Oracle分布式事务概念
- 文字或者图片连续滚动
- 一:redis 的string类型 - 相关操作
- pixhawk px4 commander.cpp
- java初始化数据报_java – 如何在Docker中初始化数据库后启动flyway
- Discuz!客户端api开发(一)
- T-SQL DATEPART() Functions
- 邮箱可以群发邮件吗?邮件群发怎么发?推荐邮箱邮件群发平台
- 《python深度学习》笔记(八):回归问题
- js中 英文中文混合排序
- IDEA 在debug 模式下启动tomcat报错:Application Server was not ..reason:Unable to ping server at localhos:1199
- 1062: [NOI2008]糖果雨 - BZOJ
- 获取硬盘的smart信息
- 深度模型框架(持续更新)
- 英伟达RTX 4070 Ti显卡正式发布!你会买吗?
- 计算机网络水晶头博客,两台电脑组成局域网(交叉线)的水晶头制作详解
- CIO40:企业信息化为什么要进行顶层设计?
- Acwing 265. 营业额统计
- LaTeX入门学习9(tikz基础-01)
热门文章
- 领先大厂股价大跌,半导体行业形势不妙
- 浴室预约微信小程序的设计与实现
- Powershell 数字转大写中文,数字金额转中文繁体(改自C#)
- 【Ant Design】图标大全(网断专用)
- 小丸子学Hadoop系列之——部署Hbase集群
- 【011】疫苗接种管理系统
- 武大计算机专业薪酬,2018大学毕业生薪酬排行榜公布:武大输给华科,更意想不到的高校是它...
- nvcc编译器之编译内幕(chapter 23)
- 如何构建一个基于IEC61499 的“云化PLC“
- 错误使用 load ASCII 文件的行号 1 中的文本未知“MATLAB“。