Spring (60)Spring WebFlux

Spring WebFlux 是 Spring 5.0 引入的新的响应式框架,用于构建异步的、非阻塞的和事件驱动的服务。WebFlux 使用了 Reactor 作为其响应式库,该库基于 Reactive Streams 规范。

核心概念

在深入了解之前,我们需要明确几个关键概念:

  • Reactor: WebFlux底层使用的响应式编程库,提供MonoFlux这两个核心响应式类型。Mono代表0到1个元素的异步序列,而Flux代表0到N个元素的异步序列。
  • Reactive Streams: 一套流处理的标准,定义了异步处理数据流的一组接口。

WebFlux 配置

WebFlux 可以使用两种编程模型:注解式和函数式。注解式模型与Spring MVC 类似,受Spring MVC开发者欢迎。函数式模型则更为灵活,提供了路由和处理函数的定义方式。

注解式模型示例

首先,你需要在你的项目中添加对Spring Boot Starter WebFlux的依赖。

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

然后,你可以创建控制器和请求处理方法,使用@RestController@RequestMapping注解。

@RestController
@RequestMapping("/api")
public class ReactiveController {@GetMapping("/hello")public Mono<String> hello() {return Mono.just("Hello, WebFlux!");}
}

在这个例子中,hello方法返回了一个Mono<String>,这意味着它会异步地返回一个字符串。

函数式模型示例

函数式模型使用RouterFunctionHandlerFunction来定义路由和处理逻辑。

@Configuration
public class RoutingConfig {@Beanpublic RouterFunction<ServerResponse> route(ReactiveHandler handler) {return RouterFunctions.route(GET("/functional/hello"), handler::hello);}
}@Component
public class ReactiveHandler {public Mono<ServerResponse> hello(ServerRequest request) {return ServerResponse.ok().body(Mono.just("Hello, WebFlux!"), String.class);}
}

在这个例子中,RoutingConfig定义了一个路由到ReactiveHandlerhello方法。再次强调,所有的操作都是异步非阻塞的。

WebFlux 源码分析

Spring WebFlux 的内部,是基于异步和非阻塞的核心组件构建的,比如 WebHandler 接口,它是所有请求处理的核心。

当请求到达时,DispatcherHandler 负责将请求分配给适当的HandlerMapping,找到对应的Handler。然后HandlerAdapter负责实际调用请求处理方法。

在响应式栈中,Spring使用了Netty作为默认的嵌入式服务器,尽管也可以选择其他支持Reactive Streams的服务器。

性能考量

与传统的基于Servlet的Spring MVC相比,WebFlux更适合处理长时间运行的或者高并发的请求,因为它避免了每个请求一个线程的模型,减少了线程切换和内存使用。

注意事项:

  • WebFlux 需要Reactor库版本与Spring框架兼容。
  • WebFlux与Spring MVC不能在同一个应用中共存,因为它们的底层模型不一样。
  • 不是所有的库和数据存储都支持响应式编程,因此在选择WebFlux之前需要确认整个技术栈的兼容性。

通过以上步骤和代码演示,你可以开始使用Spring WebFlux来构建响应式服务。与任何技术栈一样,选择使用WebFlux应根据应用程序的具体需求和场景来做出。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/28559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B headA, headBwhile A ! B:A A.next if A else headBB B.next if B else headAreturn A

golang学习笔记——结构体嵌套接口

文章目录 结构体嵌套接口结构体嵌套结构体结构体实现接口接口嵌套接口结构体嵌套接口例子1例子2 总结参考资料 结构体嵌套接口 今天看k8s client-go源码时发现&#xff0c;结构体嵌套接口的现象。 // deployments implements DeploymentInterface type deployments struct {c…

gt9x双击唤醒屏幕

里面可以看到irq 和 rst的gpio引脚从设备树获取失败&#xff0c;排查设备树发现是属性名写错了&#xff1a; c &i2c1 {status "okay";goodix_ts5d {compatible "goodix,gt9xx";reg <0x5d>;// tp-size <89>;touchscreen-size-x <12…

Go Goroutine 究竟可以开多少?(详细介绍)

Go Goroutine 究竟可以开多少&#xff1f; Go语言因其高效的并发处理能力而备受欢迎&#xff0c;而Goroutine则是Go语言实现并发编程的核心。Goroutine比传统的线程更加轻量&#xff0c;允许开发者轻松地处理大量并发任务。那么&#xff0c;Go语言中的Goroutine究竟可以开多少…

6.1触发器的创建、删除和使用

6.1.1 触发器概述 触发器是一个被指定关联到表的数据库对象&#xff0c;与表的关系密切&#xff0c;不需要用户调用&#xff0c;在一个表的特定事件出现时将会被激活&#xff0c;此时某些MySql语句会自动执行。 触发器用于实现数据库的完整性&#xff0c;具有以下特点&#xff…

深入了解RSA加密算法

目录 前言 一、什么是RSA&#xff1f; 二、RSA加密的基本概念 1.非对称加密 2.密钥生成 3.加密和解密 三、RSA加密的工作原理 四、RSA的应用场景 五、RSA加密解密的实现 六、RSA算法的局限性及改进措施 前言 在当今的数字化时代&#xff0c;信息的安全性成为了人们关注…

密码学-密码协议之零知识证明

一、前言 零知识证明实际上一种密码协议&#xff0c;该协议的一方称为证明者(Prover)&#xff0c;通常用P表示&#xff0c;协议的另一方是验证者(Verifier)&#xff0c;一般用V表示。零知识证明是指P试图使V相信某个论断是正确的&#xff0c;但却不向V提供任何有用的信息&…

Photoshop中图像美化工具的应用

Photoshop中图像美化工具的应用 Photoshop中的裁剪工具Photoshop中的修饰工具模糊工具锐化工具涂抹工具 Photoshop中的颜色调整工具减淡工具加深工具海绵工具 Photoshop中的修复工具仿制图章工具污点修复画笔工具修复画笔工具修补工具内容感知移动工具红眼工具 Photoshop中的裁…

【杂记-浅谈以太网IP数据帧】

一、以太网数据帧 以太网数据帧是网络通信的基础单元&#xff0c;遵循IEEE 802.3标准&#xff0c;用于在以太网中传输数据。一个典型的以太网数据帧包括前导码、帧开始符、目的MAC地址、源MAC地址、类型或长度字段、数据载荷和帧校验序列。其中&#xff0c;类型字段指明了上层…

数据可视化:让数据讲述故事

数据可视化&#xff1a;让数据讲述故事 引言 在信息爆炸的时代&#xff0c;数据无处不在。然而&#xff0c;数据本身并不直观&#xff0c;很难从中直接获取有价值的信息。数据可视化作为一种强大的工具&#xff0c;能够帮助我们揭示数据背后的故事&#xff0c;让我们以更直观…

Spring Boot顶层接口实现类注入项目的方法

1、背景 在项目中&#xff0c;我们通常会具有同一特性的业务类定义一个顶层接口&#xff0c;让业务类实现这个接口&#xff0c;通过接口规范来管理这些类。我们将这些实现接口的业务类交托给Spring容器接口后&#xff0c;有时候需要根据业务类型来选择动态选择对应的业务类阿里…

尚品汇-(二)

一&#xff1a;环境安装 1.安装JAVA 运行环境 第一步&#xff1a;上传或下载安装包 cd /usr/local jdk-8u152-linux-x64.tar.gz 第二步&#xff1a;解压安装包 tar -zxvf jdk-8u152-linux-x64.tar.gz 第三步&#xff1a;建立软连接&#xff08;快捷方式&#xff09; ln -…

SpringBoot配置第三方专业缓存技术Redis

Redis缓存技术 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统&#xff0c;通常用作数据库、缓存和消息中间件。它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等&#xff0c;并提供了丰富的功能和灵活的…

4.1 初探Spring Boot

初探Spring Boot实战概述 Spring Boot简介 Spring Boot是一个开源的Java框架&#xff0c;由Pivotal团队&#xff08;现为VMware的一部分&#xff09;开发&#xff0c;旨在简化Spring应用程序的创建和部署过程。它通过提供一系列自动化配置、独立运行的特性和微服务支持&#…

类加载的初始化阶段的奥秘

一、概述 初始化阶段是类加载机制&#xff08;加载&#xff0c;链接&#xff08;验证&#xff0c;准备&#xff0c;解析&#xff09;&#xff0c;初始化&#xff09;的最后一步。在准备阶段已经为类变量赋过一次值&#xff08;默认为0或null&#xff09;。在初始化阶段&#xf…

HTML和CSS基础(一)

前言 HTML&#xff08;HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。它由各种标签组成&#xff0c;这些标签定义了网页的结构和内容。HTML的早期形式诞生于1989年&#xff0c;由CERN的物理学家Tim Berners-Lee发明&#xff0c;最初用于在科学家之…

js 刷题常用方法

Object 对象共有 toString()valueOf()obj.keys()obj.values()obj.entries()for of 循环…扩展运算符Array.of()Array.from() 数组使用时 toString 返回以逗号分隔的字符串valueOf 返回数组本身 Array 数组 创建数组 Array.from(可迭代对象)Array.of(传入一组参数) let arr…

C语言 | Leetcode C语言题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {if (headA NULL || headB NULL) {return NULL;}struct ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA NULL ? headB : pA->ne…

windows11 x64 23H2 企业纯净版2024.6.16

闲来无事试安装了下da_nao_yan的 【6月12日更新】Windows11 22631.3737企业版 23H2 自用优化版 &#xff08;原版地址&#xff1a;https://bbs.pcbeta.com/viewthread-1985546-1-1.html&#xff09;&#xff0c;感觉比原版流畅多了&#xff0c;重新按照自己习惯封装了下&#x…

C++作业第四天

#include <iostream> using namespace std; class Per { private: string name; int age; int *high; double *weight; public: //构造函数 Per() { cout << "Per的无参构造" << endl; } Per(str…