07-Spring5 WebFlux响应式编程

本文详细介绍了SpringWebFlux响应式编程,包括WebFlux的特点、与SpringMvc的区别,以及如何使用Java和Reactor实现响应式编程。通过实例展示了基于注解和函数式两种编程模型的应用,并讲解了WebClient的使用。文章还涵盖了SpringWebFlux的执行流程、核心API以及Netty服务器的相关知识。
摘要由CSDN通过智能技术生成

SpringWebFlux介绍

简介

  1. SpringWebFlux是Spring5添加的新模块,用于Web开发,功能和SpringMvc类似的,WebFlux使用当前一种比较流行的响应式编程框架
  1. 使用传统的Web框架,比如SpringMvc,这些是基于Servlet容器, WebFlux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的

什么是异步非阻塞

    1. 异步和同步
    2. 非阻塞和阻塞
    1. 上面都是针对对象不一样

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

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

WebFlux特点

    1. 非阻塞式: 在有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程
    2. 函数式编程: Spring5框架基于Java8, WebFlux使用Java8函数式编程方式实现路由请求

比较SpringMvc

    1. 第一: 两个框架都可以使用注解方式,都运行在Tomcat等容器中
    2. 第二: SpringMvc采用命令式编程, WebFlux采用异步响应式编程

响应式编程(Java实现)

什么是响应式编程

响应式编程是一种面向数据流和变化传播的编程范式,这意味着可以在编程语言中很方便的表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播,电子表格程序就是响应式编程的一个例子,单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的变化而变化.

Java8及其之前的版本

提供的 "观察者模式" 两个类Observer 和 Observable

新建SpringBoot项目

新建一个SpringBoot的项目,我直接建一个模块算了

ok了

编写代码

package com.dance.webflux.reactor8;

import lombok.extern.slf4j.Slf4j;

import java.util.Observable;
import java.util.Observer;

@Slf4j
public class ObserverDemo extends Observable {

    public static void main(String[] args) {

        ObserverDemo observerDemo = new ObserverDemo();

        // 添加观察者
        observerDemo.addObserver((o, arg) -> {
            log.info("o:{},arg:{}",o,arg);
            System.out.println("发生变化");
        });

        // 添加观察者
        observerDemo.addObserver((o, arg) -> {
            log.info("o:{},arg:{}",o,arg);
            System.out.println("手动被观察者通知,准备改变");
        });

        // 发生改变
        observerDemo.setChanged();

        // 通知观察者
        observerDemo.notifyObservers();

    }

}

执行结果

23:00:10.650 [main] INFO com.dance.webflux.reactor8.ObserverDemo - o:com.dance.webflux.reactor8.ObserverDemo@504bae78,arg:null
手动被观察者通知,准备改变
23:00:10.663 [main] INFO com.dance.webflux.reactor8.ObserverDemo - o:com.dance.webflux.reactor8.ObserverDemo@504bae78,arg:null
发生变化

响应式编程(Reactor实现)

简介

  1. 响应式编程操作中,Reactor是满足Reactive规范框架
  2. Reactor有两个核心类, Mono和Flux,这两个类实现接口Publisher,提供丰富的操作符,Flux对象实现发布者,返回N个元素,Mono对象实现发布者,返回1或者0个元素
  1. Flux和Mono都是数据流的发布者,使用Flux和Mono都可以发出三种数据信号,"元素值","错误信号","完成信号",错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者

代码演示Flux和Mono

引入依赖

<dependency>
  <groupId>io.projectreactor</groupId>
  <artifactId>reactor-core</artifactId>
  <version>3.1.5.RELEASE</version>
</dependency>

编写代码

package com.dance.webflux.reactor8;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class TestReactor {

    public static void main(String[] args) {
        /*
         * just 方法直接声明
         */
        Flux flux = Flux.just(1, 2, 3);

        Mono mono = Mono.just(1);

        // 其他方法
        // 数组
        Integer[] array = new Integer[]{1,2,3,4};
        Flux flux1 = Flux.fromArray(array);
        // 集合
        List array2 = Arrays.asList(1, 2, 3, 4);
        Flux flux2 = Flux.fromIterable(array2);
        // Stream
        Stream stream = array2.stream();
        Flux flux3 = Flux.fromStream(stream);
        // 供给型函数式接口Stream
        Flux tFlux = Flux.fromStream(() -> Stream.of(1, 2, 3));
        
    }

}

三种信号特点

  1. 错误信号和完成信号都是终止信号, 不能共存的
  2. 如果没有发送任何元素值,而是直接发送错误或者完成信号,表示是空数据流
  1. 如果没有错误信号,没有完成信号,表示是无限数据流

真的,去看一下Java8吧,不然真看不懂

订阅数据流

调用just或者其他方法只是声明数据流,数据流并没有发出,只有在进行订阅之后才会触发数据流,不订阅什么都不会发生

// 订阅数据流
flux.subscribe(x -> System.out.print(x + " "));
System.out.println();
mono.subscribe(System.out::println);

执行结果

1 2 3 
1

操作符

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

第一: map 元素映射为新元素(来自StreamAPI)

第二 flatmap 元素映射为流

把每个元素转换为流 把转换之后多个流合并为一个流

SpringWebFlux执行流程和核心API

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

Netty

BIO

执行过程

SpringWebFlux执行过程和SpringMvc相似

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值