spring的Webflux

Spring5 框架新功能(Webflux)

1、SpringWebflux 介绍

(1)是 Spring5 添加新的模块,用于 web 开发的,功能和 SpringMVC 类似的,Webflux 使用
当前一种比较流行的响应式编程出现的框架

(2)使用传统 web 框架,比如 SpringMVC,这些基于 Servlet 容器,Webflux 是一种异步非阻
塞的框架
,异步非阻塞的框架在 Servlet3.1 以后才支持,核心是基于 Reactor (响应式编程)的相关 API 实现的。
(3)解释什么是异步非阻塞

目录

Spring5 框架新功能(Webflux)


上面都是针对对象不同

      异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步

      阻塞和非阻塞针对被调用者,被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞,受到请求之后马上给出反馈然后再去做事情就是非阻塞

    比如A给B发送请求,B收到请求之后 执行完业务逻辑才回复就是阻塞
    而受到请求后立刻返回 再去执行业务逻辑就是非阻塞

(4)Webflux 特点:

        非阻塞式:在有限资源下,提高系统吞吐量和伸缩性(通俗点说就是能在有限的资源下处理                             更多的请求),以 Reactor 为基础实现响应式编程
       函数式编程:Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求
(5)比较 SpringMVC

两个框架都可以使用注解方式,都运行在 Tomcat 等容器中
SpringMVC 采用命令式(一行一行代码执行)编程,Webflux 采用异步响应式编程
如何选取:一般项目使用mvc,如果有远程服务调用的可以用Webflux,能在有限的资源中处理更多的请求量,比如微服务的网关可以用Webflux(非阻塞异步方式)实现

2.响应式编程

1)什么是响应式编程?

响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便
地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。

电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公
式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。

2)Java8 及其之前版本


提供的观察者模式(观察关心数据的变化,当关心数据发生变化发生响应)两个类 Observer 和 Observable(JDK9之后flow) 

package com.chen.Reactor;

import java.util.Observable;


import java.util.Observable;

public class ObserverDemo extends Observable {
    public static void main(String[] args) {
        ObserverDemo demo= new ObserverDemo();
        //添加观察者
        demo.addObserver((o,arg)->{
            System.out.println("发生了变化");
        });

        demo.addObserver((o,arg)->{
            System.out.println("收到被观察者通知,准备发生改变");
        });
        //监控当前数据的变化
        demo.setChanged();
        //数据变化后通知
        demo.notifyObservers();

    }
}

3、响应式编程(Reactor 实现)

(1)响应式编程操作中,Reactor 是满足 Reactive 规范框架

(2)Reactor 有两个核心类,Mono 和 Flux,这两个类实现接口 Publisher(发布者),提供丰富操作符。
Flux 对象实现发布者,返回 N 个元素;
Mono 实现发布者,返回 0 或者 1 个元素

(3)Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号:
元素值,错误信号,完成信号,错误信号和完成信号都代表终止信号,终止信号用于告诉
订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者

 

 

箭头表示时间轴,连续发送几个信号,竖线代表完成信号

  • 引入依赖
<dependency>
 <groupId>io.projectreactor</groupId>
 <artifactId>reactor-core</artifactId>
 <version>3.1.5.RELEASE</version>
</dependency>

(4)代码演示 Flux 和 Mono

public class TestReactor {
    public static void main(String[] args) {
            //just方法直接去声明相关的元素
            Flux.just(1,2,3,4);
            Mono.just(1);

            //其他的方法 数组形式数据流
            Integer[] array = {1,2,3,4};
            Flux.fromArray(array);

            //list集合形式数据流
            List<Integer> list = Arrays.asList(array);
            Flux.fromIterable(list);

            //stream形式数据流
            Stream<Integer> stream = list.stream();
            Flux.fromStream(stream);
        }

}

(5)三种信号特点

错误信号和完成信号都是终止信号,不能共存的
如果没有发送任何元素值,而是直接发送错误或者完成信号,表示是空数据流
如果没有错误信号,没有完成信号,表示是无限数据流
(6)调用 just 或者其他方法只是声明数据流,数据流并没有发出,只有进行订阅之后才会触
发数据流,不订阅什么都不会发生的

 //just方法直接去声明相关的元素
        Flux.just(1,2,3,4).subscribe(System.out::println);//subscribe做一个订阅
        Mono.just(1).subscribe(System.out::print);

(7)操作符

对数据流进行一道道操作,成为操作符,比如工厂流水线

  • map 元素映射为新元素  

  • 上方元素通过map操作后变换成下方元素

  • flatMap 元素映射为流
    把每个元素转换流,把转换之后多个流合并大的流 

  • 上方元素变成流 把流做成输出 

4.Webflux 执行流程和核心API

SpringWebflux 基于 Reactor,默认使用容器是 Netty,Netty 是高性能的 NIO 框架,异步非阻
塞的框架

(1)Netty

  • BIO(阻塞)

  • 建立socket之后只有一直往下执行才可以进行其他操作

  • NIO(非阻塞)

  •  

    channerl通道 每个操作都是一个通道,每个操作调用一个通道,通道注册到selector(选择器,多路复用器),选择器关注里面的状态

  • (2)SpringWebflux 执行过程和 SpringMVC(DispatchServlet) 相似的

  •      SpringWebflux 核心控制器 DispatchHandler,实现接口 WebHandler
  •      接口 WebHandler 有一个方法

5.springWebflux(基于注解编程模型)

6.springWebflux(基于函数式编程模型)

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值