Webflux核心

article/2025/8/29 1:59:18

什么是WebFlux? Spring WebFlux 是一套全新的 Reactive Web 栈技术,实现完全非阻塞,支持 Reactive Streams 背压等特性,并且运行环境不限于 Servlet 容器(Tomcat、Jetty、Undertow),如 Netty 等。Spring WebFlux 与 Spring MVC 可共存,在 Spring Boot 中,Spring MVC 优先级更高。为什么优先级高,大家可以看看我之前的文章https://blog.csdn.net/mikezzmeric/article/details/87209555

我们为什么要使用web flux呢?Spring官方讲了两个主要原因,第一点是servlet API部分是阻塞式的,而且Listner和Filter是同步的方式。这个原因其实是错误的,我们早就知道Servlet在3.1的时候就已经可以异步的方式返回结果了。第二点原因是函数式编程的出现,这个原因可以算,但是不完全。所以个人觉得原因如下:从 Spring MVC 注解驱动的时代开始,Spring 官方有意识地去 Servlet 化。不过在 Spring MVC 的时代,Spring扔拜托不了 Servlet 容器的依赖,然而 Spring 借助 Reactive Programming 的势头,WebFlux 将 Servlet 容器从必须项变为可选项,并且默认采用 Netty Web Server 作为基础,从而组件地形成 Spring 全新技术体系,包括数据存储等技术栈:

Webflux的实现可以是函数式的实现也可以是注解式的实现,我们看一个例子:

函数映射:

RouterFunction<ServerResponse> route =
route(GET("/person/{id}").and(accept(APPLICATION_JSON)), handler::getPerson)
.andRoute(GET("/person").and(accept(APPLICATION_JSON)), handler::listPeople)
.andRoute(POST("/person"), handler::createPerson);


对应的注解映射如下:

@GetMapping(value="/person/{id}",consumes=APPLICATION_JSON)
public void getPerson(HttpServletRequest request,HttpServletResponse) {
}
@GetMapping(value="/person",consumes=APPLICATION_JSON)
public void listPeople(HttpServletRequest request,HttpServletResponse) {
}
@PostMapping(value="/person")
public void createPerson(HttpServletRequest request,HttpServletResponse) {
}


实现的功能一样,方式呢有所区别。

Spring MVC 和 Spring WebFlux 均能使用注解驱动 Controller,然而不同点在于并发模型和阻塞特性。Spring MVC 通常是Servlet 应用,因此,可能被当前线程阻塞。以远程调用为例,由于阻塞的缘故,导致 Servlet容器使用较大的线程池处理请求。Spring WebFlux 通常是非阻塞服务,不会发生阻塞,因此该阻塞服务器可使用少量、固定大小的线程池处理请求。

接下来介绍一下WebFlux的核心组件:

1.HttpHandler

是一种带有处理 HTTP 请求和响应方法的简单契约。

2.WebHandler


webHandler显得有一些抽象,我们可以通过对比SpringMVC的一些组件帮助大家理解一下在WebFlux中各个组件的作用:

接下来我们看一下采用函数式的方式编写的时候,一个请求的处理流程是怎样的:

 

RouterFunctionMapping中有private RouterFunction<?> routerFunction;这里面表面看起来只有一个Bean,其实它里面组合了非常多的RouterFunction,它是如何根据用户的请求找到对应的Function的呢?

@Overrideprotected Mono<?> getHandlerInternal(ServerWebExchange exchange) {if (this.routerFunction != null) {ServerRequest request = ServerRequest.create(exchange, this.messageReaders);return this.routerFunction.route(request).doOnNext(handler -> setAttributes(exchange.getAttributes(), request, handler));}else {return Mono.empty();}}


关键部分就是通过它的成员变量routerFunction的route方法来找,其实就是通过用户写的predicate来判断请求是否相符合,如果符合就返回一个Mono<HandlerFunction<T>>

WebFlux的使用场景,我们根据一些测试报告来看看:

1.性能考虑:

1.1WebFlux提升的其实往往是系统的伸缩性,对于速度的提升没有太多的明显。所以它不适合注入RPC这类对RT(响应时间)要求较高的应用。
1.2关注编程用户友好性,Reactive 编程尽管没有新增大量的代码,然而编码(和调试)却是变得更为复杂
1.3现在面临的最大问题是缺少文档。在生成测试应用中,它已经给我们造成了最大障碍,并使得我们可能已经缺少了关键点。因此,我们并不会太快地投入 Reactive 编程,同时等待关于它的更多反馈。因此,Spring WebFlux 尚未证明自身明显地优于Spring MVC。

2.编程模型

注解驱动编程模型

函数式编程模型

到底选择哪一个呢?

如果SpringMVC应用工作的挺好的,就没必要切换成webflux。

如果你想使用非阻塞的技术栈,可以考虑使用WebFlux。当然也不一定非要webflux,servlet3.1之后我们也知道提供了非阻塞的方式。

如果想使用轻量级的函数式编程,可以考虑使用函数式编程模型。

 

3.并发模型适用性

如果你的请求不需要实时的返回,那么可以使用异步的方式。

如果RT敏感,不要使用异步模型,因为涉及到线程切换或者等待可能引发超时。

 

--------------------- 
作者:光贤 
来源:CSDN 
原文:https://blog.csdn.net/mikezzmeric/article/details/88075658 
版权声明:本文为博主原创文章,转载请附上博文链接!


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

相关文章

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;因此通…

redis数据类型插入输出命令

进入客户机&#xff1a;redis-cli 中文字符不能显示&#xff1a;redis-cli --raw、get Course:1:Cname 一、redis数据类型数据的添加 1、String 添加数据&#xff1a;set StringTest(数据名称) “helloword”(数据) 显示数据&#xff1a;get StringTest&#xff08;数据名称&am…

Redis数据类型及使用场景

转自&#xff1a; http://www.kubiji.cn/juhe-id7106.html Redis数据类型及使用场景 来源&#xff1a; WQTech阅读&#xff1a; 2936 时间&#xff1a;2 小时前 摘要&#xff1a;Redis相比其它的KV数据库,其一大特点是支持丰富的数据类型.它一共支持5种数据类型,下面逐一介绍这…

Redis数据类型与操作命令

1. 键值对数据库 1.1 redis数据结构 redis的数据是 key-value 形式的键值对&#xff0c;其中 key 其实都是字符串的形式&#xff0c;而 value 的数据类型&#xff0c;也就是数据的保存形式&#xff0c;底层实现的方式就用到了数据结构。 所以我们一直说的“redis五种数据结构…

Redis数据类型

文章目录 STRINGLISTSETHASHZSET Redis主要有5种数据类型&#xff0c;包括String&#xff0c;List&#xff0c;Set&#xff0c;Zset&#xff0c;Hash&#xff0c;满足大部分的使用要求&#xff0c;Redis各数据类型的使用场景可以参考Redis使用场景 数据类型可以存储的值操作ST…

redis数据类型(5种)和底层实现

redis数据类型(5种)和底层实现 Redis的特点 要用好Redis&#xff0c;首先要明白它的特点&#xff1a; 读写速度快。redis官网测试读写能到10万左右每秒。速度快的原因这里简单说一下&#xff0c;第一是因为数据存储在内存中&#xff0c;我们知道机器访问内存的速度是远远大于…

Redis数据类型及编码

Redis数据类型及编码 说到Redis的数据类型&#xff0c;我们大概会很快想到Redis的5种常见的数据类型&#xff1a;字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted Set)&#xff0c;以及他们的特点和运用场景及常用命令。不过在讲五大数据类型之前&#x…