同步和异步
同步:同步网络是对消息的到达时间有限定要求time bounded,以便保证网络活动的确定性。同步编程简单来说就是,发出一个任务,然后等待执行。
异步:异步的网络,则对消息的到达没有任何限制。即使发出的消息丢失了,也不会损害网络的活性。异步编程就是,发出一个任务,不等待结果,就继续发出下一个任务。
Stream
什么是webflux
webflux是Spring推出的响应式web框架,它的对标产品为SpringMVC, 与传统的SpringMVC相比较,webflux是完全非阻塞式的,充分利用多核 CPU 的硬件资源去处理大量的并发请求。webflux是Spring推出的一种响应式编程的技术栈框架,和我们学习的SpringBoot,Spring有异曲同工之处。
响应式编程reactive programming是一种基于数据流data stream和变化传递propagation of change的声明式的编程范式
注意:WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。
webflux应用:在 IO 密集型的服务中,比如微服务网关这样的应用中。在程序中大量使用异步方式,推荐使用webflux,同步多的话还是使用SpringMVC
官方文档地址: docs.spring.io/spring-fram…
快速搭建 webflux 应用
方式一、Spring 官网选择 Spring Reactive Web 依赖下载下来,解压缩
start.spring.io/?spm=a2c6h.…
方式二、idea 初始化项目时候选择 Spring Initializer,在下一步时候选择web的Spring Reactive Web
方式三、建立一个空的maven项目,添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.6.RELEASE</version>
<relativePath/>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
1、主启动类上加入 @EnableWebFlux 开启 webflux 功能
2、新建Controller写一个方法
@GetMapping("/monoList")
public Mono<List<User>> monoList() {
return Mono.just(userService.userList());
}
3、启动应用,查看日志输出,webflux 是基于Netty启动的,并且默认的端口号是 8080
webflux中的基本概念
Flux
Flux 是一个发出0-N个元素组成的异步序列的Publisher,可以被onComplete信号或者onError信号所终止。在响应流规范中存在三种给下游消费者调用的方法 onNext, onComplete, 和onError,返回的是列表对象。
Mono
Mono 是一个发出0-1个元素的Publisher,可以被onComplete信号或者onError信号所终止,返回的是单个对象。
reactor.core.publisher;
abstract class Mono implements CorePublisher
对象是通过 Mono 对象包装的,在 WebFlux 中,Mono 是非阻塞的写法,只有这样,你才能发挥 WebFlux非阻塞和异步的特性。