1.什么是WebFlux?

  WebFlux不需要Servlet API,在完全异步且无阻塞,并通过Reactor项目实现了Reactor Streams规范。

  WebFlux可以在资源有限的情况下提高系统的吞吐量和伸缩性。

  WebFlux除支持Restful Web服务外,还可以用于提供动态HTML内容。

2.比较MVC和WebFlux

  SpringMVC采用命令式编程的方式,代码被一句一句的执行,便于开发者理解与调试代码,WebFlux则是基于异步响应式编程!

  1.工作方式

  MVC

  MVC的工作流程是:主线程接收到请求(request)-> 准备数据 ->返回数据。

  整个过程是单线程阻塞的,用户会感觉等待时间长是因为,在结果处理好之后才会返回结果给浏览器。。因此,如果请求过多,则吞吐量会上不去。

  WebFlux

  工作流程:主线程接收到请求 -> 立刻返回数据与函数的组合 -> 开启一个新的work线程去做实际的数据准备工作,进行真正的业务操作 -> work线程完成工作 -> 返回用户真实数据(结果)

  这种方式给人的感觉是响应时间很短,因为返回的是不变的常数,它不随用户数量的增加而变化!不支持MySql等关系型数据库。

3/认识Mono和Flux

  Mono和Flux属于事件发布者,为消费者提供订阅接口。当有事件发生时,Mono和Flux会回调消费者的相应方法,然后通知消费者相应的事件。

  Mono和Flux用于处理异步数据流,它不像MVC中那样直接返回String/list,而是将异步数据流包装Mono和Flux对象。

  Mono和Flux的区别

  Mono主要用于返回单个数据,Flux主要用于返回多个数据。

  举例:如果要根据id查询某个User对象,则返回的肯定是单个User,那么需要将其包装成Mono<User>

  若需要获取所有User,则需要将这个集合包装成Flux<User>.这里的单个数据并不是指的是一个数据,而是指一个封装好的对象。多个数据就是多个对象。

开发WebFLux的流程

  1.注解式开发流程

  WebFLux是响应式框架。地址映射也是通过@RequestMapping提供的,用@Controller和@RestController来代替Handler类。

  2.响应式开发流程

  1.创建handler类

  这里的handler类相当于SpringMVC的Controller层中的方法体。在响应式编程中,请求和相应不再是HttpServletRequest和HttpServletResponse,而是变成了ServerRequest和ServerResponse。

  2.配置RouterFunction

  RouterFunction和注解@RequestMapping类似,都用于提供URL路径。

实例:用注解式开发实现数据的增加,删除,修改和查询

  首先创建实体类

package com.example.demo.webFlux.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor; @Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private long id;
private String name;
private int age;
}

  然后编写控制器,实现WebFlux操作数据功能,

  

package com.example.demo.controller;

import com.example.demo.webFlux.entity.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono; import javax.annotation.PostConstruct;
import javax.jws.soap.SOAPBinding;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors; @RestController
@RequestMapping(path = "/user")
public class UserController {
Map<Long, User> users = new HashMap<>(); @PostConstruct
public void init() throws Exception{
users.put(Long.valueOf(1),new User(1,"Curry",34));
users.put(Long.valueOf(2),new User(2,"Iverson",44));
}
/*
* 获取所有用户
* */
@GetMapping("/list")
public Flux<User> getAll(){
return Flux.fromIterable(users.entrySet().stream().map(entry->entry.getValue()).collect(Collectors.toList()));
}
/*
* 获取单个用户
* */
@GetMapping("/{id}")
public Mono<User> getUser(@PathVariable Long id){
return Mono.justOrEmpty(users.get(id));
}
/*
* 创建用户
* */
@PostMapping("")
public Mono<ResponseEntity<String>> addUser(User user){
users.put(user.getId(),user);
return Mono.just(new ResponseEntity<>("添加成功", HttpStatus.CREATED));
}
/*
* 修改用户
* */
@PutMapping("/{id}")
public Mono<ResponseEntity<User>> putUser(@PathVariable Long id,User user){
user.setId(id);
users.put(id,user);
return Mono.just(new ResponseEntity<>(user,HttpStatus.CREATED));
}
/*
* 删除用户
* */ @DeleteMapping("/{id}")
public Mono<ResponseEntity<String>> deleteUser(@PathVariable Long id){
users.remove(id);
return Mono.just(new ResponseEntity<>("删除成功",HttpStatus.ACCEPTED));
}
}

  最后,启动项目,看结果

  

下面,来通过postman来增添一份数据,

通过put请求可以修改数据

SpringBoot实战派读书笔记---响应式编程的更多相关文章

  1. springboot(二十三)Springboot2.X响应式编程

    序言 Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,并 通过React ...

  2. 【SpringBoot】SpringBoot2.0响应式编程

    ========================15.高级篇幅之SpringBoot2.0响应式编程 ================================ 1.SprinBoot2.x响应 ...

  3. SpringBoot 2.x (14):WebFlux响应式编程

    响应式编程生活案例: 传统形式: 一群人去餐厅吃饭,顾客1找服务员点餐,服务员把订单交给后台厨师,然后服务员等待, 当后台厨师做好饭,交给服务员,经过服务员再交给顾客1,依此类推,该服务员再招待顾客2 ...

  4. 《Java并发编程实战》读书笔记一 -- 简介

    <Java并发编程实战>读书笔记一 -- 简介 并发的历史 并发的历史,也是人类利用有限的资源去提高生产效率的一个的例子. 设想现在有台计算机,这台计算机具有以下的资源: 单核CPU一个 ...

  5. 《Go并发编程实战》读书笔记-语法概览

    <Go并发编程实战>读书笔记-语法概览 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客我们会快速浏览一下Go的语法,内容涉及基本构成要素(比如标识符,关键字,子 ...

  6. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  7. SpringBoot使用WebFlux响应式编程操作数据库

    这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...

  8. 响应式编程笔记三:一个简单的HTTP服务器

    # 响应式编程笔记三:一个简单的HTTP服务器 本文我们将继续前面的学习,但将更多的注意力放在用例和编写实际能用的代码上面,而非基本的APIs学习. 我们会看到Reactive是一个有用的抽象 - 对 ...

  9. 《Java 8实战》读书笔记系列——第三部分:高效Java 8编程(四):使用新的日期时间API

    https://www.lilu.org.cn/https://www.lilu.org.cn/ 第十二章:新的日期时间API 在Java 8之前,我们常用的日期时间API是java.util.Dat ...

随机推荐

  1. 典型相关分析CCA计算过程

      本文介绍了CCA解决的问题,CCA原理的推导过程,以及对计算结果物理意义的解释.并且通过SPSS和R操作演示了一个关于CCA的例子.数据文件下载参考[8],SPSS输出结果文件下载参考[9],R代 ...

  2. Taurus.MVC WebAPI 入门开发教程1:框架下载环境配置与运行(含系列目录)。

    前言: Taurus.MVC 微服务版本已经发布了:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单. 以前都是框架发布时写点相关功能点的文章,没有形成 ...

  3. 5.10 NOI 模拟

    最近总是管不住自己摆烂,没法像\(Zwaire\)一样管住自己,摆完之后会有负罪感,一直恶性循环,认识到了这个问题,我希望能逐渐改正(不对,马上放假了,不如摆烂到放假) 话说\(GD,HN\)的老哥都 ...

  4. 线程本地存储 ThreadLocal

    线程本地存储 · 语雀 (yuque.com) 线程本地存储提供了线程内存储变量的能力,这些变量是线程私有的. 线程本地存储一般用在跨类.跨方法的传递一些值. 线程本地存储也是解决特定场景下线程安全问 ...

  5. 【安全通告】关于 DolphinScheduler 漏洞情况的说明

    点击上方 蓝字关注我们 [安全通报] [影响程度:低] Apache DolphinScheduler 社区邮件列表最近通告了 1 个漏洞,考虑到有很多用户并未订阅此邮件列表,我们特地在此进行情况说明 ...

  6. Luogu3267 [JLOI2016/SHOI2016]侦察守卫 (树形DP)

    树形DP,一脸蒙蔽.看了题解才发现它转移状态与方程真不愧神题! \(f[x][y]\)表示\(x\)的\(y\)层以下的所有点都已经覆盖完,还需要覆盖上面的\(y\)层的最小代价. \(g[x][y] ...

  7. 888. 公平的糖果交换--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/fair-candy-swap 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 假 ...

  8. postgresql用户与权限管理

    pg使用角色的概念管理数据库访问权限,角色是一系列相关权限的集合.为了管理方便,通常把一系列先关的权限赋予给一个角色,如果哪个用户需要这些权限,就把这些角色赋予给响应的用户. 由于用户也拥有一系列的相 ...

  9. SpringBoot项目搭建 + Jwt登录

    临时接了一个小项目,有需要搭一个小项目,简单记录一下项目搭建过程以及整合登录功能. 1.首先拿到的是一个码云地址,里面是一个空的文件夹,只有一个 2. 拿到HTTPS码云项目地址链接,在IDEA中cl ...

  10. JCEF 初体验,window系统构建jar包

    前言 本文记录如何通过jcef源代码去构建自己所需要的jar包,此文章构建的为windows64位jcef 的 jar 包,若需要构建 32 位的 jar 包,则需要按照文章将相关准备软件设置为 32 ...