响应式编程:Project Reactor与WebFlux

在现代Web应用程序中,响应式编程成为一种越来越流行的方法,以处理高并发和高吞吐量。响应式编程不仅仅是一种新的编程范式,它还引入了一套新的工具和技术来处理数据流和异步事件。本文将深入探讨Project Reactor与Spring WebFlux,提供详细解释和代码示例,帮助您全面理解响应式编程的强大之处。

什么是响应式编程?

响应式编程是一种处理异步数据流的编程范式。它的核心思想是通过非阻塞的方式处理数据流和事件,能够更高效地利用系统资源,特别是对于I/O密集型操作。响应式编程的四个基本特性是:

  • 响应性:系统能够在一定时间内作出反应。
  • 弹性:系统能够在发生故障时保持可用。
  • 弹性:系统能够在负载剧增时保持可用。
  • 消息驱动:系统通过异步消息传递进行通信。
Project Reactor简介

Project Reactor是一个响应式库,提供了相应API来支持响应式编程。Reactor是基于Reactive Streams规范的,它提供了两个核心抽象:MonoFlux

  • Mono:表示包含0或1个元素的异步序列。
  • Flux:表示包含0到N个元素的异步序列。
Reactor的基本使用

首先,引入依赖:

<dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId><version>3.4.12</version>
</dependency>

创建一个简单的MonoFlux示例:

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;public class ReactorDemo {public static void main(String[] args) {// Mono示例Mono<String> mono = Mono.just("Hello, Mono!");mono.subscribe(System.out::println);// Flux示例Flux<String> flux = Flux.just("Hello,", "Flux!");flux.subscribe(System.out::println);}
}
Spring WebFlux简介

Spring WebFlux是Spring 5引入的响应式Web框架,是Spring MVC的响应式版本。WebFlux可以使用Reactor作为响应式库。

设置Spring WebFlux项目

首先,引入必要的依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency><groupId>io.projectreactor</groupId><artifactId>reactor-core</artifactId>
</dependency>
创建一个简单的WebFlux控制器
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;@RestController
public class HelloController {@GetMapping("/mono")public Mono<String> getMono() {return Mono.just("Hello, Mono!");}@GetMapping("/flux")public Flux<String> getFlux() {return Flux.just("Hello,", "Flux!");}
}

启动Spring Boot应用:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WebFluxApplication {public static void main(String[] args) {SpringApplication.run(WebFluxApplication.class, args);}
}

访问http://localhost:8080/monohttp://localhost:8080/flux可以看到响应式API的输出。

更复杂的示例:从数据库查询数据

假设我们有一个用户管理系统,我们希望以响应式方式从数据库读取用户信息。

首先,配置数据库连接和依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency><groupId>io.r2dbc</groupId><artifactId>r2dbc-postgresql</artifactId>
</dependency>

配置数据库连接:

spring:r2dbc:url: r2dbc:postgresql://localhost:5432/mydbusername: myuserpassword: mypassword

定义用户实体和仓库:

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.stereotype.Repository;@Table("users")
public class User {@Idprivate Long id;private String name;private String email;// Getters and Setters
}@Repository
public interface UserRepository extends ReactiveCrudRepository<User, Long> {
}

创建用户控制器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;@RestController
public class UserController {@Autowiredprivate UserRepository userRepository;@GetMapping("/users")public Flux<User> getAllUsers() {return userRepository.findAll();}@GetMapping("/users/{id}")public Mono<User> getUserById(@PathVariable Long id) {return userRepository.findById(id);}
}

在用户表中插入一些数据,然后启动应用并访问http://localhost:8080/usershttp://localhost:8080/users/{id}以查看效果。

总结

响应式编程通过非阻塞和异步处理显著提高了系统的性能和可扩展性。Project Reactor和Spring WebFlux是实现响应式编程的强大工具,提供了丰富的API和灵活的配置选项。通过上述简单示例展示了如何使用这些工具构建响应式应用程序,您可以根据实际需求进一步扩展和优化这些示例,构建高性能的现代Web应用程序。

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

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

相关文章

3D问界—MAYA制作铁丝栅栏(透明贴图法)

当然&#xff0c;如果想通过建立模型法来实现铁丝栅栏的效果&#xff0c;也不是不行&#xff0c;可以找一下栅栏建模教程。本篇文章主要是记录一下如何使用透明贴图来实现创建铁丝栅栏&#xff0c;主要应用于场景建模&#xff0c;比如游戏场景、建筑场景等大环境&#xff0c;不…

PGCCC|【PostgreSQL】PG考证对工作上有什么好处# PG证书

认证 PostgreSQL 考证&#xff08;PostgreSQL Certification&#xff09;在工作上有以下几个好处&#xff1a; 增强专业能力&#xff1a;通过考证&#xff0c;可以系统地学习和掌握 PostgreSQL 数据库的知识和技能&#xff0c;提高自己的专业水平。 提升职业竞争力&#xff1…

CentOS 7 初始化环境配置详细

推荐使用xshell远程连接&#xff0c;如链接不上 请查看 CentOS 7 网络配置 修改主机名 hostname hostnamectl set-hostname xxx bash 关闭 SElinux 重启之后生效 配置yum源&#xff08;阿里&#xff09; 先备份CentOS-Base.repo&#xff0c;然后再下载 mv /etc/yum.repos…

JAVA Math类详细介绍

Math类常见方法&#xff1a; 1&#xff09;abs 绝对值 2&#xff09;pow 求幂 3&#xff09;ceil 向上取整 4&#xff09;floor 向下取整 5&#xff09;round 四舍五入 6&#xff09;sqrt 求开方 7&#xff09;random 求随机数 //思考:请写出获取 a-b之间的一个随机整数…

android R ext4 image打包脚本介绍

一、Android R打包指令使用介绍 &#xff08;1&#xff09;mkuserimg_mke2fs #./mkuserimg_mke2fs --help usage: mkuserimg_mke2fs [-h] [--android_sparse] [--journal_size JOURNAL_SIZE][--timestamp TIMESTAMP] [--fs_config FS_CONFIG][--product_out PRODUCT_OUT][--b…

小程序图片下载保存方法,图片源文件保存!

引言 现在很多时候我们在观看到小程序中的图片的时候&#xff0c;想保存图片的原文件格式的话&#xff0c;很多小程序是禁止保存的&#xff0c;即使是让保存的话&#xff0c;很多小程序也会限制不让保存原文件&#xff0c;只让保存一些分辨率很低的&#xff0c;非常模糊的图片…

Spring Boot 注解 @PostConstruct 介绍

Spring Boot 注解 PostConstruct 介绍 文章目录 Spring Boot 注解 PostConstruct 介绍一、基本介绍二、PostConstruct 的执行时机Spring Bean 的生命周期PostConstruct 的确切执行时机执行顺序示例重要注意事项 三、使用场景及代码示例1. 初始化资源&#xff1a;比如打开数据库…

基于opencv的图片加水印实现方案

加水印应该是个很常见的需求&#xff0c;但是网上找的代码&#xff0c;都感觉不太完善。记录下自己搞出来的一个方案 水印有几个需求&#xff1a; 中文文字水印文字倾斜满图都是&#xff0c;而不是只有一个地方水印文字所在之处完全展示水印 实现思路 准备水印图 我是这么…

k8s一些名词解释

潮汐计算 是一种根据负载变化动态调整资源分配的计算模式。其核心思想是利用峰值和非峰值时段的资源需求差异,动态地扩展或缩减计算资源。在 Kubernetes 环境中,可以通过自动扩展(auto-scaling)机制,根据工作负载的变化自动调整计算资源,最大化资源利用率并减少不必要的…

QT-RTSP相机监控视频流

QT-RTSP相机监控视频流 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include "mainwindow.h"#include <QDebug>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), m_settings("outSmart", "LiveWatcher&…

清华大学学报哲学社会科学版

《清华大学学报》&#xff08;哲学社会科学版&#xff09;投稿须知 一、本刊简介 《清华大学学报》&#xff08;哲学社会科学版&#xff09;由清华大学主办&#xff0c;是首批国家社会科学基金资助期刊、全国中文核心期刊、中国人文社会科学核心期刊、中文社会科学引文索引&…

Gmsh教程

13、在没有底层CAD模型的情况下重新擦除STL文件 import gmsh # 导入Gmsh库&#xff0c;用于几何建模和网格划分 import math # 导入数学库&#xff0c;用于计算 import os # 导入操作系统库&#xff0c;用于处理文件路径 import sys # 导入系统库&#xff0c;用于…

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…

07. Hibernate 会话工厂(SessionFactory)

1. 前言 Hibernate 的核心价值观是&#xff1a;开发者们&#xff01;做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一&#xff1a;会话工厂&#xff08;SessionFactory&#xff09;。 通过本节课&#xff0c;你…

Redis数据结构--跳跃表 Skip List

跳跃表&#xff08;Skip List&#xff09;是一种高效的随机化数据结构&#xff0c;通过引入多层索引来实现快速的查找、插入和删除操作。它在Redis中被用来实现有序集合&#xff08;Sorted Set&#xff09;&#xff0c;在处理大量数据时表现出了优越的性能和灵活性。本文将详细…

MySQL增量备份

增备1 做增量备份前&#xff0c;是需要进行一次完成备份的 1、做数据修改 创建一个add1.t1 t1 包含&#xff1a;id,name 加2条数据 id | name | ---------- | 1 | add1 | | 2 | add2 | ----------操作如下&#xff1a; MySQL root(none):(none)> show databases; -…

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册

Linux openEuler_24.03部署MySQL_8.4.0 LTS安装实测验证安装以及测试连接全过程实操手册 前言: 什么是 MySQL? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,…

深入探讨SQL Server端口设置:理论与实践

引言 在现代企业级应用中&#xff0c;SQL Server作为微软的旗舰数据库产品&#xff0c;广泛应用于各种关键业务系统中。设置SQL Server的端口是数据库管理中的一个重要环节&#xff0c;它不仅影响到数据库的安全性&#xff0c;还直接关系到网络通信的效率和稳定性。本文将从计…

C++ 入门基础:开启编程之旅

文章目录 引言一、C的第⼀个程序二、命名空间1、namespace2、namespace的定义 三、C输入 与 输出四、缺省参数五、函数重载六、引用1、引用的概念和定义2、引用的特性3、指针和引用的关系七、inline八、nullptr 引言 C 是一种高效、灵活且功能强大的编程语言&#xff0c;广泛应…

C1W4.Assignment.Naive Machine Translation and LSH

理论课&#xff1a;C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…