如何在 Spring Boot 中使用 WebFlux

news2025/1/6 19:55:39

如何在 Spring Boot 中使用 WebFlux

随着互联网应用的复杂度不断增加,传统的请求响应模型已经无法满足日益增长的需求。传统的 Web 应用使用 Servlet 容器,采用同步阻塞的方式来处理请求,请求需要等待相应的处理逻辑完成后才能返回结果。这种方式的缺点是很明显的,它会阻塞线程,导致资源的浪费,同时也限制了应用的并发处理能力。

WebFlux 是 Spring Framework 5 中引入的一种新的响应式编程模型,它基于 Reactor 库,可以提供异步非阻塞的方式来处理请求,从而提高应用程序的性能和可伸缩性。在本文中,我们将介绍如何在 Spring Boot 中使用 WebFlux。

在这里插入图片描述

什么是 WebFlux?

WebFlux 是 Spring Framework 5 中引入的一种新的响应式编程模型,它基于 Reactor 库,可以提供异步非阻塞的方式来处理请求。WebFlux 实现了 Reactive Streams 规范,可以与其他实现了该规范的库进行交互,例如 Reactor 和 RxJava。

相比传统的 Web 应用,WebFlux 可以提供更高的吞吐量和更低的延迟,同时也可以提高应用程序的可伸缩性和容错性。WebFlux 还提供了一些有用的功能,例如响应式数据访问、响应式 Web 安全性、响应式 Web 客户端等。

在 Spring Boot 中使用 WebFlux

在 Spring Boot 中使用 WebFlux 非常简单。我们只需要添加 Spring Boot WebFlux Starter 依赖即可。Spring Boot WebFlux Starter 包含了所有必要的依赖项,可以帮助我们快速构建 WebFlux 应用程序。

首先,我们需要在项目的 pom.xml 文件中添加 Spring Boot WebFlux Starter 依赖:

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

添加完依赖后,我们可以开始编写 WebFlux 应用程序了。我们需要创建一个控制器类,该类可以处理请求并返回响应。在本文中,我们将创建一个简单的控制器类,该类可以接受 GET 请求并返回 Hello World。

首先,我们需要创建一个 HelloWorldController 类,它应该继承 AbstractController 类。AbstractController 是一个抽象类,它提供了处理请求和返回响应的方法。

package com.example.demo;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import reactor.core.publisher.Mono;

@RestController
public class HelloWorldController extends AbstractController {

    @GetMapping("/")
    public Mono<ResponseEntity<String>> helloWorld() {
        return Mono.just(ResponseEntity.ok("Hello World"));
    }
}

在这个例子中,我们创建了一个 HelloWorldController 类,并在该类中定义了一个 helloWorld 方法。helloWorld 方法使用 @GetMapping 注解标记,表示它可以处理 GET 请求,并将请求的路径设置为根路径 “/”.

helloWorld 方法返回一个 Mono 对象,该对象包装了一个 ResponseEntity 对象,表示响应的状态码、头部和正文。在这个例子中,我们将响应的状态码设置为 200,表示请求成功,并将正文设置为 “Hello World”。

我们可以使用 @RestController 注解标记 HelloWorldController 类,表示它是一个控制器类。@RestController 注解相当于 @Controller 和 @ResponseBody 注解的组合。

现在,我们已经完成了 WebFlux 应用程序的编写。我们可以启动应用程序并访问 http://localhost:8080/,应该能够看到 “Hello World” 的响应。

WebFlux 的路由和处理器函数

在 WebFlux 中,我们可以使用两种不同的方式来处理请求:路由和处理器函数。

路由

路由是一种传统的方式,它将请求映射到相应的处理器方法。在 WebFlux 中,我们可以使用 RouterFunctions 类来创建路由。RouterFunctions 类提供了许多方法,可以帮助我们创建路由和处理器方法。

我们可以通过创建一个 RouterFunction 对象来定义路由。RouterFunction 对象由多个路由器函数组成,每个路由器函数都可以处理特定的请求。我们可以使用 RouterFunctions.route 方法来创建路由器函数。

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

import reactor.core.publisher.Mono;

@Configuration
public class RouterConfiguration {
    
    @Bean
    public RouterFunction<ServerResponse> route() {
        return RouterFunctions.route()
                .GET("/", request -> ServerResponse.ok()
                        .contentType(MediaType.TEXT_PLAIN)
                        .body(Mono.just("Hello World"), String.class))
                .build();
    }
}

在这个例子中,我们创建了一个 RouterConfiguration 类,并在该类中定义了一个 route 方法。route 方法创建了一个 RouterFunction 对象,并添加了一个路由器函数。路由器函数使用 GET 方法处理根路径 “/” 的请求,并返回一个包含 “Hello World” 字符串的 Mono 对象。

我们可以使用 @Configuration 注解来标记 RouterConfiguration 类,表示它是一个配置类。当应用程序启动时,Spring Boot 将自动扫描所有的配置类,并加载它们。

处理器函数

处理器函数是 WebFlux 中的另一种处理请求的方式。处理器函数是一组函数,它们接受请求并返回响应。在 WebFlux 中,我们可以使用 HandlerFunction 接口来定义处理器函数。

package com.example.demo;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.HandlerFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

import reactor.core.publisher.Mono;

@Configuration
public class HandlerConfiguration {
    
    @Bean
    public HandlerFunction<ServerResponse> helloWorld() {
        return request -> ServerResponse.ok()
                .contentType(MediaType.TEXT_PLAIN)
                .body(Mono.just("Hello World"), String.class);
    }
    
    @Bean
    public RouterFunction<ServerResponse> route() {
        return RouterFunctions.route()
                .GET("/", helloWorld())
                .build();
    }
}

在这个例子中,我们创建了一个 HandlerConfiguration 类,并在该类中定义了一个 helloWorld 方法。helloWorld 方法返回一个 HandlerFunction 对象,该对象可以处理请求并返回响应。我们还创建了一个 route 方法,该方法创建了一个 RouterFunction 对象,并将 helloWorld 方法添加为路由器函数。

我们可以使用 @Configuration 注解来标记 HandlerConfiguration 类,表示它是一个配置类。当应用程序启动时,Spring Boot 将自动扫描所有的配置类,并加载它们。

WebFlux 的异步编程模型

在 WebFlux 中,我们可以使用异步编程模型来处理请求。异步编程模型可以提供更高的并发处理能力和更低的延迟,同时也可以减少资源的浪费。

在 WebFlux 中,我们可以使用 Mono 和 Flux 类来处理异步操作。Mono 表示一个包含单个元素的响应式序列,Flux 表示一个包含多个元素的响应式序列。

下面是一个使用 Mono 和 Flux 的例子:

package com.example.demo;

import java.time.Duration;

import org.springframework.http.MediaType;
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 HelloWorldController {

    @GetMapping(value = "/hello", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> hello() {
        return Flux.just("Hello", "World")
                .delayElements(Duration.ofSeconds(1))
                .map(String::toUpperCase);
    }

    @GetMapping(value= "/hello/{name}", produces = MediaType.TEXT_PLAIN_VALUE)
    public Mono<String> hello(@PathVariable String name) {
        return Mono.just("Hello " + name);
    }
}

在这个例子中,我们创建了一个 HelloWorldController 类,并定义了两个方法:hello 和 helloWithName。hello 方法返回一个 Flux 对象,该对象表示一个包含 “Hello” 和 “World” 两个元素的响应式序列。我们使用 delayElements 方法来模拟一个异步操作,每个元素之间间隔 1 秒钟。我们还使用 map 方法将序列中的每个元素转换为大写字母。

helloWithName 方法使用 @PathVariable 注解来获取请求路径中的参数,并返回一个包含 “Hello” 和参数值的字符串的 Mono 对象。

在 WebFlux 中,我们还可以使用 Mono 和 Flux 来处理数据库查询、外部 API 调用等异步操作。在这种情况下,我们可以使用 Reactive MongoDB、Reactive Redis、WebClient 等响应式库来处理异步操作。

WebFlux 的测试

在 WebFlux 中,我们可以使用 WebTestClient 类来测试我们的应用程序。WebTestClient 类提供了一组方法,可以帮助我们发送请求并验证响应。

下面是一个使用 WebTestClient 的例子:

package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest;
import org.springframework.http.MediaType;
import org.springframework.test.web.reactive.server.WebTestClient;

@WebFluxTest
public class HelloWorldControllerTest {

    @Autowired
    private WebTestClient webTestClient;

    @Test
    public void testHelloWorld() {
        webTestClient.get().uri("/")
                .accept(MediaType.TEXT_PLAIN)
                .exchange()
                .expectStatus().isOk()
                .expectBody(String.class).isEqualTo("Hello World");
    }
}

在这个例子中,我们创建了一个 HelloWorldControllerTest 类,并注入了一个 WebTestClient 对象。我们还定义了一个 testHelloWorld 方法,该方法使用 WebTestClient 对象发送 GET 请求,并验证响应是否正确。

在 WebFlux 中,我们还可以使用 MockServer 和 MockMvc 来测试我们的应用程序。MockServer 是一个模拟 HTTP 服务器,可以帮助我们测试应用程序的异步请求和响应。MockMvc 是一个模拟 MVC 环境的框架,可以帮助我们测试应用程序的控制器和视图。

总结

在本文中,我们介绍了如何在 Spring Boot 中使用 WebFlux。WebFlux 是一种基于 Reactor 库的响应式编程模型,可以提供异步非阻塞的方式来处理请求,从而提高应用程序的性能和可伸缩性。我们还介绍了 WebFlux 的路由和处理器函数、异步编程模型和测试方法。希望本文可以帮助你了解如何在 Spring Boot 中使用 WebFlux。

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

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

相关文章

【C/C++实战项目】万年历

目录 项目分析 项目效果 头文件及全局变量 获取天数 打印月份、年份日历 main函数 项目分析 实现查询某一个年份、月份&#xff0c;以日历的格式打印为了观赏性利用符号对打印的每一个日期进行分格特殊节日日期能够在日历中标注出来万年历的起始日期是公元1年&#xff0…

[Orin Nx] 如何跑满GPU和CPU,观察温度和散热性能?

1、环境说明 硬件: Nvidia Orin NX 16GB 软件&#xff1a;Jetson Linux R35.3.1 2、工具安装部署 GPU的压力测试主要使用工具&#xff1a; https://github.com/anseeto/jetson-gpu-burn CPU的压力测试主要使用工具 stress 注意安装 jetson-gpu-burn需要在 /etc/apt/sourc…

SpringBoot 客户信息管理系统-计算机毕设 附源码80944

SpringBoot客户信息管理系统 摘 要 随着计算机技术的发展&#xff0c;特别是计算机网络技术与数据库技术的发展&#xff0c;使用人们的生活与工作方式发生了很大的改观。本课题研究的客户信息管理系统&#xff0c;主要功能模块包括统计图&#xff0c;系统用户&#xff08;管理…

JS高级用法:像大神一样玩转JavaScript

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 前言 众所周知&#xff0c;JavaScript是一种非常流行的编程语言&#xff0c;它已经成为了…

回收站如何添加到桌面?没有回收站的数据怎么恢复

最近收到很多这样的咨询&#xff1a; 咨询1&#xff1a;在网吧上网&#xff0c;不小心把照片删了&#xff0c;可恨的是这里没有回收站&#xff0c;请问怎么找回照片&#xff01;&#xff01;&#xff01;急&#xff0c;谢谢了。 咨询2&#xff1a;在网吧上网&#xff0c;一删除…

emmylua+Rider 断点调试

1、下载安装并激活好rider&#xff08;本次版本基于&#xff1a;JetBrains Rider 2023.1.3&#xff09; 2、从插件商店中安装emmylua 3、打开项目 在unity中设置好&#xff0c;使用rider打开项目即可 4、Unity中打开相应的场景 &#xff08;此场景基于Xlua官方Demo展示&…

初中生台灯如何选择?眼科专家推荐的学生台灯分享

保护视力一直是家长们经常提醒孩子们的一句话&#xff0c;但据统计青少年学生的近视率还是非常高&#xff0c;很多家长认为这是不良的用眼习惯导致的&#xff0c;却没想过可能是其他原因&#xff0c;因为孩子除了自身保持良好的用眼习惯外&#xff0c;在学习时用眼的光线也是十…

有哪些智能聊天ai机器人?这几种ai工具都能进行聊天

在当前ai技术日益成熟的时代&#xff0c;越来越多的ai聊天机器人开始走进我们的生活中&#xff0c;为我们带来更多乐趣和便利。这几款ai聊天机器人不仅可以陪伴我们度过孤独的夜晚&#xff0c;还可以为我们提供各种对话服务。它们能理解我们的话语&#xff0c;与我们进行自然对…

【Linux 系统编程】Linux背景介绍 及 基本指令详解(一)

文章目录 1. Linux背景1.1 发展史1.2 开源精神1.3 官网1.4 企业应用现状1.5 发行版本1.6 os概念&#xff0c;定位 2. Linux下基本指令2.1 几个常用基本命令演示2.2 某些概念的解释2.3 ls 指令2.4 pwd 指令2.5 cd 指令Linux的目录结构绝对路径与相对路径cd 常用快捷命令 2.6 tou…

【unity每日一记】transform类精华之珠

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

【Java】JVM学习(二)

JVM的内存区域 运行时数据区域 运行时数据区的定义&#xff1a; Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 Java 引以为豪的就是它的自动内存管理机制。相比于 C的手动内存管理、复杂难以理解的指针等&#xff0c;Java 程序写起来就方…

前端Vue自定义精美tabs,可设置下划线图标 热门标题

前端Vue自定义精美tabs&#xff0c;可设置下划线图标 热门标题&#xff0c; 下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13186 效果图如下&#xff1a; # cc-beautyTabs #### 使用方法 使用方法 <!-- tabchange: tab选择事…

为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言AI的崛起与编程语言…

NXP i.MX 6ULL工业开发板硬件说明书( ARM Cortex-A7,主频792MHz)

前 言 本文档主要介绍TLIMX6U-EVM评估板硬件接口资源以及设计注意事项等内容。 创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;稳…

轻松复制:Elasticsearch 中跨集群复制指南

跨集群的数据复制是一个复杂且耗时的过程。 公司必须使用外部工具或编写自定义脚本将数据从一个集群移动到另一个集群。 Elasticsearch 以其跨集群复制功能来救援。 跨集群复制 (CCR) 是 Elasticsearch 中的一项内置功能&#xff0c;允许近乎实时地将数据从一个集群复制到另一…

C语言预处理命令

文章目录 1 什么是预处理命令2 预处理指令实例3 C语言宏定义4 C语言预处理命令总结参考 1 什么是预处理命令 这些在编译之前对源文件进行简单加工的过程&#xff0c;就称为预处理&#xff08;即预先处理、提前处理&#xff09;。预处理主要是处理以#开头的命令&#xff0c;例如…

【c语言】-- 操作符汇总(万字详解)

&#x1f4d5;博主介绍&#xff1a;目前大一正在学习c语言&#xff0c;数据结构&#xff0c;计算机网络。 c语言学习&#xff0c;是为了更好的学习其他的编程语言&#xff0c;C语言是母体语言&#xff0c;是人机交互接近底层的桥梁。 本章来学习操作符。 让我们开启c语言学习之…

【正点原子STM32连载】第四十章 红外遥控实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html# 第四…

管理类联考——逻辑——知识篇——形式逻辑——二、性质模态——haimian

性质 考点分析 定义分类 思维导图 模态 考点分析 削弱 年度 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023题量112 定义分类 断定事物发生可能性的命题就是模态命题。 按照可能性的高低&#xff0c;我们可以将模态命题分为如下几类&#xff1a; ①必然发…

Android12 设置系统默认不休眠-迅为RK3588开发板

修改文件&#xff1a; device/rockchip/rk3588/overlay/frameworks/base/packages/SettingsProvider/res/values/defaults. xml 文件&#xff0c;如下图所示&#xff1a; - 60000 0x7fffffff 更多详情 公众Hao/B站&#xff1a;迅为电子