Spring核心知识(五)

简介: webflux是spring推出的响应式web框架,它的对标产品为spring-mvc, 与传统的spring-mvc相比较,webflux是完全非阻塞式的。

Webflux

简介

webflux是spring推出的响应式web框架,它的对标产品为spring-mvc, 与传统的spring-mvc相比较,webflux是完全非阻塞式的。

Webflux 特点:

第一 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以 Reactor 为基础实现响应式编程。

第二 函数式编程:Spring5 框架基于 java8,Webflux 使用 Java8 函数式编程方式实现路由请求。

同步与异步,阻塞与非阻塞

同步:调用者发送请求,一直等待回应再去做其他的事情。

异步,调用者发送请求,不等对方回应就去做其他事情。

阻塞,被调用者受到请求之后,做完请求任务之后才给出反馈

非阻塞,被调用者受到请求之后,马上给出反馈再去做事情。

响应式编程

响应式编程是一种编程示例,可促进异步,非阻塞,事件驱动的数据处理方法。 响应式编程涉及将数据和事件建模为可观察的数据流,并实现数据处理例程以对这些流中的更改做出反应。

响应式编程可以理解为,当某一主题发生改变时,观察此主题的观察者就会立刻收到通知并做出一系列相应。

举个例子,在一个数据系统中,如果数据发生了变化,就会触发相应一系列的变化,数据改变,数据访问层发生变化,业务逻辑层发生变化 ,控制器发生变化,UI也做出相应的变化。

观察者模式

public class Observe extends Observable {
    public static void main(String[] args){
        Observe observe=new Observe();
        /*
        * 响应式编程
        * */
        //添加观察者
        observe.addObserver((o,arg)->{
            System.out.println("实施改变");
        });
        observe.addObserver((o,arg)->{
            System.out.println("接受通知,准备改变");
        });
        observe.setChanged();//数据变化
        observe.notifyObservers();//通知
    }
}

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

NIO是一种同步非阻塞的I/O模型,也是I/O多路复用的基础,已经被越来越多地应用到大型应用服务器,成为解决高并发与大量连接、I/O处理问题的有效方式。

NIO

在响应式编程操作中,Reactor 是满足 Reactive 规范框架。Reactor 有两个核心类,Mono 和 和 Flux ,这两个类实现接口 Publisher,提供丰富操作 ,提供丰富操作符。

  • Flux 对象实现发布者,返回 N 个元素;
  • Mono 实现发布者,返回 0 或者 1 个元素

Flux示意图:

Mono示意图:

引入依赖

<!--flux响应式编程-->
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-core</artifactId>
      <version>3.1.15.RELEASE</version>
    </dependency>
public class flux {
    public static void main(String[] args){
        //flux 返回多个元素
        //mono 返回0或1个元素
        Flux.just(1,2,3,4).subscribe(System.out::println);
        Mono.just(1).subscribe(System.out::println);
        Integer[] arr={1,2,3};
        Flux.fromArray(arr);
        List<Integer> list= Arrays.asList(arr);
        Flux.fromIterable(list);
        Stream<Integer> stream=list.stream();
        Flux.fromStream(stream);
    }
}
使用

导入依赖

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

基于注解的webflux

@GetMapping("/mono")
public Mono<String> mono(){
 return Mono.just("mono");
}
@GetMapping("/flux")
public Flux<String> flux(){
 return Flux.just("flux");
}

基于函数式编程的webflux

创建RouterFunction,将其注入到Spring中即可。

@Bean
pubulic RouterFuntion<ServerResponse> test01(){
 return RouterFuntions.route().Get("/flux/function",new HandlerFunction<ServerResponse>(){
 @Override
  public Mono<ServerResponse> handle(ServerRequest requrest){
       return ServerResponse.ok().bodyValue("hello");
  }
 }).build();
}

flux与Mono的相应式编程延迟案例

@GetMapping("/test")
public Mono<String> stringMono(){
 Mono<String> from=Mono.fromSupplier(() -> {
   try{
     TimeUnit.SECONDS.sleep(5);
    }catch(InterruptedException e){
         throw new RuntimeException(e);
    }
   return "hello"+LocalDateTime.now();
  });
   return from;
}
目录
相关文章
|
3月前
|
前端开发 Java 数据库连接
|
8月前
|
XML Java 数据格式
Spring基础(下)
Spring基础(下)
|
8月前
|
XML 设计模式 Java
Spring基础(上)
Spring基础(上)
|
XML 缓存 安全
Spring核心知识(二)
AOP(Aspect Oriented Programming) 意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 通俗表示:不通过修改源代码方式,在主干功能中添加新的功能。
45 1
|
XML 缓存 Java
Spring核心知识(一)
Spring是一个JavaEE开源的轻量级别的框架,可以解决我们企业开发中遇到的难题,能够让编码变的更加简单,核心组件IOC容器和Aop面向切面编程。
105 1
|
Java Spring
Spring5 - 核心原理
Spring5 - 核心原理
61 0
BXA
|
消息中间件 缓存 NoSQL
深入理解Spring Boot核心原理
Spring Boot是一个用于构建基于Spring框架的独立应用程序的框架。它采用了自动配置的原则,以减少开发人员在搭建应用架构方面的时间和精力,同时提升了系统的可维护性和可扩展性
BXA
1963 0
|
缓存 监控 安全
Spring Boot框架基础介绍
Spring Boot 是一款基于 Spring 框架的开源应用程序开发工具,它旨在简化 Spring 应用程序的配置和开发过程。Spring Boot 提供了一种简单的方式来创建可独立运行的、生产级别的应用程序,并在需要时进行部署。Spring Boot 在微服务架构和云计算环境下得到了广泛应用,本文将介绍 Spring Boot 的特性、优势以及使用方法。
1995 0
|
开发框架 缓存 监控
Spring核心原理
Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。
|
XML 缓存 Java
Spring系列二:基础篇(2)
​ 目录 IOC IOC 5.说一说什么是IOC?什么是DI? Java 是面向对象的编程语言,一个个实例对象相互合作组成了业务逻辑,原来,我们都是在代码里创建对象和对象的依赖。 所谓的IOC(控制反转):就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们需要什么,容器就给我们送来什么。 引入IOC之前和引入IOC之后 也就是说,控制对象生命周期的不再是引用它的对象,而是容器。对具体对象,以前是它控制其它对象,现在所有对象都被容器控制,所以这就叫控制反转。 控制反转示意图 DI(依赖注入):指的是容器在实例化对象的时候把
99 0
Spring系列二:基础篇(2)