Spring Boot(5)之 WebFlux 响应式编程

article/2025/8/28 23:12:14

1、WebFlux简介

springWebFlux 是 SpringFrameworl5.0 添加的新功能,WebFlux 本身是追随当下最火的 Reactive Programming 而诞生的框架,那么本编就来简述下这个框架到底是做什么的。

参考:Spring-WebFlux简介与使用

1.1、关于WebFlux

我们知道传统的Web框架,比如说:struts2,springmvc等都是基于Servlet API与Servlet容器基础之上运行的,在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架,它的核心是基于Reactor的相关API实现的。相对于传统的web框架来说,它可以运行在诸如Netty,Undertow及支持Servlet3.1的容器上,因此它的运行环境的可选择行要比传统web框架多的多。

根据官方的说法,webflux主要在如下两方面体现出独有的优势:

  1. 非阻塞式
    其实在servlet3.1提供了非阻塞的API,WebFlux提供了一种比其更完美的解决方案。使用非阻塞的方式可以利用较小的线程或硬件资源来处理并发进而提高其可伸缩性
  2. 函数式编程端点
    老生常谈的编程方式了,Spring5必须让你使用java8,那么函数式编程就是java8重要的特点之一,而WebFlux支持函数式编程来定义路由端点处理请求。

1.2、SpringMVC与SpringWebFlux

我们先来看官网的一张图:
在这里插入图片描述
  它们都可以用注解式编程模型,都可以运行在tomcat,jetty,undertow等servlet容器当中。但是SpringMVC采用命令式编程方式,代码一句一句的执行,这样更有利于理解与调试,而WebFlux则是基于异步响应式编程,对于初次接触的码农们来说会不习惯。对于这两种框架官方给出的建议是:

  1. 如果原先使用用SpringMVC好好的话,则没必要迁移。因为命令式编程是编写、理解和调试代码的最简单方法。因为老项目的类库与代码都是基于阻塞式的。
  2. 如果你的团队打算使用非阻塞式web框架,WebFlux确实是一个可考虑的技术路线,而且它支持类似于SpringMvc的Annotation的方式实现编程模式,也可以在微服务架构中让WebMvc与WebFlux共用Controller,切换使用的成本相当小。
  3. 在SpringMVC项目里如果需要调用远程服务的话,你不妨考虑一下使用WebClient,而且方法的返回值可以考虑使用Reactive Type类型的,当每个调用的延迟时间越长,或者调用之间的相互依赖程度越高,其好处就越大。

在这里插入图片描述
  我个人意见是:官网明确指出,SpringWebFlux并不是让你的程序运行的更快(相对于SpringMVC来说),而是在有限的资源下提高系统的伸缩性,因此当你对响应式编程非常熟练的情况下并将其应用于新的系统中,还是值得考虑的,否则还是老老实实的使用WebMVC吧

1.3、Reactive Spring Web

在这里定义了最基本的服务端接口:HttpHandlerWebHandler

1.3.1、HttpHandler

HttpHandler 定义了最基本的处理Http请求行为,这个接口主要作用是处理Http请求并将结果做出响应,下面这个表格是说明了Server API的使用方式及何种方式进行响应式流支持的:

Server nameServer API usedReactive Streams support
NettyNetty APIReactor Netty
UndertowUndertow APIspring-web: Undertow to Reactive Streams bridge
TomcatServlet 3.1 non-blocking I/O; Tomcat API to read and write ByteBuffers vs byte[]spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge
JettyServlet 3.1 non-blocking I/O; Jetty API to write ByteBuffers vs byte[]spring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge
Servlet 3.1 containerServlet 3.1 non-blocking I/Ospring-web: Servlet 3.1 non-blocking I/O to Reactive Streams bridge

1.3.2、WebHandler

WebHandler 定义了Web 请求必要的一些处理行为,大家不妨想想看:WebFlux已经脱离了Servlet API,那么使用WebFlux时遇到会话机制怎么办,想要对请求过滤处理怎么办或者想要处理静态资源怎么办等等,那么WebHandler 就是做这个事情的。其实在HttpHandler的基本实现类通过适配器模式及装饰模式也间接的实现了WebHandler接口:
在这里插入图片描述
WebHandler常见的实现类,我在这里列举一下:

  • WebHandlerDecorator:WebHandler的装饰器,利用装饰模式实现相关功能的扩展
  • HttpWebHandlerAdapter: 进行Http请求处理,同时也是HttpHandler的实现类
  • FilteringWebHandler:通过WebFilter进行过滤处理的类,类似于Servlet中的Filter
  • ExceptionHandlingWebHandler: 针对于异常的处理类
  • ResourceWebHandler:用于静态资源请求的处理类
  • DispatcherHandler:请求的总控制器,类似于WebMVC中的DispatcherServlet

1.4、认识 Flux 和 Mono

1.4.1、Flux 和 Mono 是 Reactor 中的两个基本概念

  1. Flux 表示的是包含 0 到 N 个元素的异步序列。

在该序列中可以包含三种不同类型的消息通知:
正常的包含元素的消息序列结束的消息序列出错的消息
当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()onError() 会被调用

  1. Mono 表示的是包含 0 或者 1 个元素的异步序列。

该序列中同样可以包含与 Flux 相同的三种类型的消息通知。
Flux 和 Mono 之间可以进行转换。
对一个 Flux 序列进行计数操作,得到的结果是一个 Mono 对象。
把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。

2、WebFlux应用

2.1、配置WebFlux依赖

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

2.2、编写控制器(基于注解)

com/example/test2/controller/HelloWorldWebFlux.java

package com.example.test2.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;@RestController
public class HelloWorldWebFlux {@RequestMapping("helloworld")public Mono<String> helloworld() {return Mono.just("Hello WebFlux!");}
}

2.3、基于SpringMvc注解

与使用SpringMvc不同的是使用SpringWebFlux同一使用Mono<>,Flux<>对象同意返回数据,如下

@RestController
@RequestMapping("/api/user")
public class WebFluxController {private Map<Long,User> map = new HashMap<Long,User>(10);@PostConstructpublic void init(){map.put(1L,new User(1,"admin","admin"));map.put(2L,new User(1,"admin2","admin2"));map.put(3L,new User(1,"admin3","admin3"));}@GetMapping("/getAll")public Flux<User> getAllUser(){return Flux.fromIterable(map.entrySet().stream().map(Map.Entry::getValue).collect(Collectors.toList()));}@GetMapping("/{id}")public Mono<User> getUserById(@PathVariable("id") Long id){return Mono.just(map.get(id));}@PostMapping("/save")public Mono<ResponseEntity<String>> save(@RequestBody User user){map.put(user.getUid(),user);return Mono.just(new ResponseEntity<>("添加成功", HttpStatus.CREATED));}
}

2.4、基于响应式开发

处理请求的类,实现具体的业务逻辑,接口 ServerRequest 表示的是一个 HTTP 请求体。通过ServerRequest 对象可获取到请求的相关信息,如请求路径、查询参数和请求内容等。方法 的返回值是一个 Mono对象。接口 ServerResponse 用来表示 HTTP 响应。ServerResponse 中包含了很多静态方法来创建不同 HTTP 状态码的响应对象

2.4.1、编写处理类Handler

Handler相当于MVC中的Controller

@Component
public class UserHandler {private IUserService userService;@Autowiredpublic UserHandler(IUserService userService) {this.userService = userService;}public Mono<ServerResponse> getAllUser(ServerRequest serverRequest){Flux<User> allUser = userService.getAllUser();return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(allUser,User.class);}public Mono<ServerResponse> getUserById(ServerRequest serverRequest){//获取url上的idLong uid = Long.valueOf(serverRequest.pathVariable("id"));Mono<User> user = userService.getUserById(uid);return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(user,User.class);}public Mono<ServerResponse> saveUser(ServerRequest serverRequest){Mono<User> user = serverRequest.bodyToMono(User.class);return ServerResponse.ok().build(userService.saveUser(user));}}

2.4.2、编写路由类Router

Router的主要功能是提供路由映射,相当于MVC模式中的注解@RequestMapping

@Configuration
public class RoutingConfiguration {@Beanpublic RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler){return route(GET("/api/user").and(accept(MediaType.APPLICATION_JSON)),userHandler::getAllUser).andRoute(GET("/api/user/{id}").and(accept(MediaType.APPLICATION_JSON)),userHandler::getUserById).andRoute(POST("/api/save").and(accept(MediaType.APPLICATION_JSON)),userHandler::saveUser);}}

http://chatgpt.dhexx.cn/article/lH8dGSrD.shtml

相关文章

对比WebFlux和WebMVC (为什么使用WebFlux)

对比WebFlux和WebMVC (为什么使用WebFlux) 1.0 WebFlux吞吐量对比WebMVC 2.0 WebFlux延迟/CPU对比WebMVC 3.0 WebFlux内存使用对比WebMVC 4.0 WebFlux最大处理请求对比WebMVC 1

Spring(十)Webflux

Webflux 1、SpringWebflux 介绍 &#xff08;1&#xff09;是 Spring5 添加新的模块&#xff0c;用于 web 开发的&#xff0c;功能和 SpringMVC 类似的&#xff0c;Webflux 使用当前一种比较流程响应式编程出现的框架。 &#xff08;2&#xff09;使用传统 web 框架&#xff…

Spring:Webflux响应式编程

目录 简介响应式编程Reactor信号操作符 SpringWebflux 执行流程和API 注解实现SpringWebflux 说明&#xff1a;基于atguigu学习笔记。 简介 Webflux是 Spring5 添加新的模块&#xff0c;用于 web 开发的&#xff0c;功能和 SpringMVC 类似的&#xff0c;Webflux 使用当前一种比…

WebFlux入门详解

文章目录 一、 WebFlux介绍1、什么是 WebFlux2、反应式库介绍2.1 Reactive Stream2.2 Reactor2.3 Reactive Stream、Reactor 和 WebFlux 关系 二、入门WebFlux1、简单介绍2、简单的例子构造 三、WebFlux与数据库1、介绍2、r2dbc实战前期准备2.1 引入依赖与配置2.2 创建数据表2.…

springboot之webmvc和webflux浅析

webmvc和webflux作为spring framework的两个重要模块&#xff0c;代表了两个IO模型&#xff0c;阻塞式和非阻塞式。 1、webmvc webmvc是基于servlet的阻塞式模型&#xff0c;一个请求到达服务器后会单独分配一个线程去处理请求&#xff0c;如果请求包含IO操作&#xff0c;线程…

Webflux核心

什么是WebFlux? Spring WebFlux 是一套全新的 Reactive Web 栈技术&#xff0c;实现完全非阻塞&#xff0c;支持 Reactive Streams 背压等特性&#xff0c;并且运行环境不限于 Servlet 容器&#xff08;Tomcat、Jetty、Undertow&#xff09;&#xff0c;如 Netty 等。Spring W…

SpringBoot Webflux解析

1. Webflux介绍 Webflux是一种异步非阻塞的IO模型&#xff0c;当有请求过来时&#xff0c;它会将请求交由worker线程去处理&#xff0c;这样就可以极大的提升吞吐量&#xff0c;所以他比较适合用于IO密集型的场景。 webflux虽然可以给我带来吞吐量的提升&#xff0c;但是同时也…

Webflux快速入门

传统的Web框架&#xff0c;如struts2&#xff0c;springmvc等都是基于Servlet API与Servlet容器基础之上运行的&#xff0c;在Servlet3.1之后才有了异步非阻塞的支持。而WebFlux是一个典型非阻塞异步的框架&#xff0c;它的核心是基于Reactor的相关API实现的。相对于传统的web框…

Spring-webflux 响应式编程

热爱可抵漫长岁月 文章目录 1. 前言2. Spring-webflux简介3. 什么是“响应式”4. Spring-webflux的响应式API5. Spring MVC 还是 WebFlux&#xff1f;6. 并发模型7. webflux使用8. 测试 1. 前言 Spring 提供了两个并行堆栈。一种是基于带有 Spring MVC 和 Spring Data 结构的 …

Spring Webflux - 01 MVC的困境

文章目录 Spring MVC的困境Servlet 异步请求缓解线程池压力Servlet 3.0 异步请求处理Code 演示工程pom配置文件启动类同步servlet演示 异步servlet辅助Code演示 Tomcat 请求处理流程以及异步请求工作原理 Spring MVC的困境 我们先看一段工作中大家常见的代码 RestController …

WebFlux的使用

什么是WebFlux springWebFlux 是 SpringFrameworlk5.0 添加的新功能&#xff0c;它是完全非阻塞的&#xff0c;支持Reactive Stream及背压&#xff0c;可以运行于Netty、Undertow等服务器&#xff0c;及Servlet 3.1容器。 webflux主要在如下两方面体现出独有的优势&#xff1a;…

webFlux入门

今天发现一个特别好的文章&#xff0c;是关于springBoot框架中响应式编程的&#xff0c;那下面就是这位博主所整理的一些干货&#x1f447; ------------------------------------------------------------ 1. WebFlux介绍 Spring WebFlux 是 Spring Framework 5.0中引入的新…

WebFlux 简介

目录 一、关于WebFlux 二、SpringMVC与SpringWebFlux 三、Reactive Spring Web HttpHandler WebHandler 四、实现WebFlux 实例 基于Annotated Controller方式实现 WebFluxConfig配置&#xff1a; Controller: Main方法&#xff1a; 函数式编程方式 集成Thymeleaf sp…

Spring Webflux 响应式编程 (二) - WebFlux编程实战

第一章 Reactive Stream 第1节 jdk9的响应式流 就是reactive stream&#xff0c;也就是flow。其实和jdk8的stream没有一点关系。说白了就一个发布-订阅模式&#xff0c;一共只有4个接口&#xff0c;3个对象&#xff0c;非常简单清晰。 什么是背压&#xff1f; 背压是指订阅者…

WebFlux 详解

今天我们开始来学习下 WebFlux&#xff0c;为什么突然要学这个东西&#xff1f; 因为我之前是想学习 Spring Cloud Gateway 来着&#xff0c;然后发现它是基于 Spring5.0SpringBoot2.0WebFlux等技术开发的。所以学之前才要来简单了解下 WebFlux 技术。 然后要学习 WebFlux 时…

Redis常用数据类型及其对应的底层数据结构

Redis数据库 Redis是一种键值(Key-Value)数据库。相较于MySQL之类的关系型数据库&#xff0c;Redis是一种非关系型数据库。Redis存储的数据只包含键和值两部分&#xff0c;只能通过键来查询值。这样简单的存储结构&#xff0c;能让Redis的读写效率非常高(HashMap读写效率都是O…

二. Redis 数据类型

2.1 Redis 字符串 (String) 2.1.1 概述 String 是 Redis 最基本的类型&#xff0c;你可以理解成与 Memcached 一模一样的类型&#xff0c;一个 key 对应一个 value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。 …

Redis数据类型Hash

文章目录 Hash类型介绍hash 类型数据的基本操作 hash 类型数据操作的注意事项Hash和String类型的区别 有时候我们往往不是在缓存中存一个值&#xff0c;而是选择存一个对象&#xff0c;比如一个购物车消息&#xff0c;我们就需要使用到hash了 Hash类型介绍 新的存储需求&…

Redis数据类型String

文章目录 数据存储类型介绍String类型String类型的基本操作String单数据操作和多数据操作的选择问题string 类型数据的扩展操作数据增加指定范围的值String 设置数据指定的生命周期string 类型数据操作的注意事项 数据存储类型介绍 常用的五个数据类型: string --------------…

Redis数据类型 - 散列(Map)

文章目录 一、散列简介二、散列的基本操作三、散列与字符串比较1、散列键的优点2、字符串键的优点 一、散列简介 散列就是hash或者说Map&#xff0c;Redis的散列键会将一个键和一个散列在数据库中关联起来&#xff0c;可以在散列中设置任意多个字符串键值对&#xff0c;因此通…