Spring Web vs Spring Webflux

news2024/12/27 1:00:00

当你需要构建Web应用程序时,Spring Web 和 Spring Webflux 是Spring生态系统中的两个框架,但它们之间有一些关键区别。

e095400b3022a9bd59bb47d4b9255749.png

Spring Web 是一个传统的Web框架,它构建在Servlet API之上。它旨在处理阻塞式I/O,即线程在从数据库或其他服务接收到响应之前被阻塞。Spring Web非常适合需要同步通信的传统Web应用程序。

相反,Spring Webflux 是一个基于Reactive Streams的响应式Web框架。它设计用于处理非阻塞I/O,即在等待来自数据库或其他服务的响应时,线程不会被阻塞。相反,应用程序可以在等待响应时继续处理其他请求。Spring Webflux非常适合需要高并发性能的应用程序,例如流式应用程序实时数据处理

下面是两个示例的代码:

Spring Web示例:

@RestController
public class WeatherController {


    @Autowired
    private WeatherService weatherService;


    @GetMapping("/weather")
    public String getWeather() {
        WeatherData weatherData = weatherService.getWeatherData();
        return "The temperature in " + weatherData.getCity() + " is " + weatherData.getTemperature() + " degrees Celsius.";
    }
}


@Service
public class WeatherService {


    @Autowired
    private RestTemplate restTemplate;


    public WeatherData getWeatherData() {
        ResponseEntity<WeatherData> response = restTemplate.getForEntity("https://api.weather.com/weatherdata", WeatherData.class);
        return response.getBody();
    }
}

Spring Webflux示例:

@RestController
public class WeatherController {


    @Autowired
    private WeatherService weatherService;


    @GetMapping("/weather")
    public Mono<String> getWeather() {
        return weatherService.getWeatherData().map(weatherData -> "The temperature in " + weatherData.getCity() + " is " + weatherData.getTemperature() + " degrees Celsius.");
    }
}


@Service
public class WeatherService {


    @Autowired
    private WebClient webClient;


    public Mono<WeatherData> getWeatherData() {
        return webClient.get().uri("https://api.weather.com/weatherdata").retrieve().bodyToMono(WeatherData.class);
    }
}

可以看到,Spring Webflux示例使用了响应式编程概念,如MonoWebClient,来处理非阻塞I/O和并发性能。而Spring Web示例则使用传统的阻塞I/O概念,如RestTemplateResponseEntity

如果Spring Web和Spring Webflux都在相同的系统资源上运行,并且同时有300个请求进入,由于其非阻塞I/O的方法,Spring Webflux的性能会更好。

在Spring Web中,每个请求都将被同步处理,这意味着处理请求的线程将被阻塞,直到接收到响应。对于300个请求,这将导致300个线程被阻塞,可能会导致高CPU和内存使用率。

相比之下,Spring Webflux可以使用单个线程同时处理300个请求,因为它使用非阻塞I/O。处理请求的线程在等待响应时不会被阻塞,而是能够处理其他请求。这导致与Spring Web相比,CPU和内存使用率较低。

总之,如果您需要处理高并发负载,由于其处理非阻塞I/O和更有效地使用系统资源的能力,Spring Webflux将是更好的选择。

以下是Spring Web和Spring Webflux的Maven依赖和配置文件。

Spring Web的Maven依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.6.2</version>
</dependency>


<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.3.1</version>
</dependency>

这些依赖包括以下库:

•Spring Web•Spring Web MVC•Spring Boot自动配置•Spring Boot Actuator(用于监控和管理应用程序)

application.yml

server:
  port: 8080
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: myusername
    password: mypassword
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: update

Spring Webflux的Maven依赖:

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


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    <version>2.6.2</version>
</dependency>

application.yml

server:
  port: 8080
spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: mydb
      username: myusername
      password: mypassword

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

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

相关文章

CTFHub | 过滤cat

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

Springboot读取配置文件的方式以及多环境读取的方式

Springboot读取配置文件的方式以及多环境读取的方式 一.首先介绍一下读取配置文件中的值的方式1.Value注解2.ConfigurationProperties注解赋值3.使用 Environment 读取配置文件 多环境读取 在项目中我们可能需要灵活的配置一些参数&#xff0c;就会将这些参数写到yaml文件或者p…

C++技能系列 ( 4 ) - 深入理解C++临时对象【解析与提高性能手段】

系列文章目录 C技能系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream w…

Ubuntu设置虚拟机共享目录/mnt/hgfs下无文件显示相关问题归纳

文章目录 问题一&#xff1a;/mnt目录下无hgfs文件夹问题二&#xff1a;/mnt/hgfs 文件夹为空 问题一&#xff1a;/mnt目录下无hgfs文件夹 问题背景&#xff1a; 在打开共享目录A的时候&#xff0c;突然改变共享目录&#xff0c;也就是从A改到了B&#xff0c;但是资源管理器还…

TiDB v7.1.0版本 相关(部署、在线扩容、数据迁移)测试

作者&#xff1a; tomxu 原文来源&#xff1a; https://tidb.net/blog/69083bca TiDB v7.1.0版本 相关&#xff08;部署、在线扩容、数据迁移&#xff09;测试 一、服务器信息参数 | 序号 | 服务器型号 | 主机名 | 配置 | | IP地址 | 用户名 | 密码 | | -- | --------- | …

chatgpt赋能python:Python怎么过滤异常值-降噪数据的利器

Python怎么过滤异常值 - 降噪数据的利器 什么是异常值 在数据分析和机器学习领域&#xff0c;我们常常需要对数据进行预处理&#xff0c;其中一个常见的问题就是异常值。也可以称为噪声数据或离群点&#xff0c;指数据集中与其他值相差较大的点。通常这些异常值出现的原因有很…

6.10 面向对象抽象

抽象类 1 概念 Java中可以定义被abstract关键字修饰的方法,这种方法只有声明,没有方法体,叫做抽象方法. Java中可以定义被abstract关键字修饰的类,被abstract关键字修饰的类叫做抽象类 如果一个类含有抽象方法,那么它一定是抽象类 抽象类中的方法实现交给子类来完成 2 抽象…

MsSqlServer配置管理器TCP/IP属性

TCP/IP 属性&#xff08;“IP 地址”选项卡&#xff09; 使用 “TCP/IP 属性&#xff08;‘IP 地址’选项卡&#xff09;” 对话框&#xff0c;可以配置特定 IP 地址的 TCP/IP 协议选项。 只有选中 “IP All” &#xff0c;才能一次配置所有地址的 “TCP 动态端口” 和 “TCP…

Linux学习[16]bash学习深入2---别名设置alias---history指令---环境配置相关

文章目录 前言1. alias2. history3. 环境配置相关总结 前言 linux学习15里面简单提了一下alias指令&#xff0c;就表明它是一个别名的作用&#xff0c;这节就展开来写一下。 同时上一节一笔带过的history指令&#xff0c;这一节也进行例子的演示记录。 最后是环境相关的配置&a…

高斯过程(Gaussian Process)回归预测,例子,代码及可视化展示

高斯过程指的是一组随机变量的集合&#xff0c;这个集合里面的任意有限个随机变量都服从联合正态分布。&#xff08;联合正态分布是指多个随机变量的联合分布满足正态分布。联合分布是指多个随机变量同时满足的概率分布&#xff0c;一个常见的例子是考虑两个随机变量&#xff1…

【2023年最新】提高分类模型指标的六大方案详解

文章目录 数据增强特征选择调整模型参数模型集成迁移学习模型解释完结 当今&#xff0c;机器学习模型得到了广泛的应用&#xff0c;其中分类模型是其中最常见和重要的一种。在实际应用中&#xff0c;如何提高分类模型的指标&#xff0c;使其在不同场景下表现更佳并且具有更好的…

【Web网页制作】影视主题网页制作web页面开发(附源码)

【写在前面】 其实之前我就写过一篇关于我的家乡的页面&#xff0c;也有不少网友和我私下反馈&#xff0c;让我多出一些关于页面制作的&#xff0c;于是乎我就今天晚上抽出点时间来整理一篇关于影视内容的web页面制作&#xff0c;希望能够得到大家的喜欢。 【涉及内容】 web网页…

什么是进程?程序又是什么?程序运行在操作系统来看是怎么做的?

相信很多人都看到过课本上写的进程的概念&#xff0c;那么真的理解了吗&#xff1f; 课本上是这样讲的&#xff0c;课本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等。 那么进程到底是什么&#xff1f;我先把内核层面上的概念拿出来&#xff1a;内核观点&a…

【算法基础】基础算法

快速排序 模板题&#xff1a;785. 快速排序 - AcWing题库 思路&#xff1a; 定义一个x&#xff08;一般喜欢用中间的&#xff09;&#xff0c;我们快速排序&#xff0c;让x左边的都比它小&#xff0c;同时让右边的都比它大。然后像二分一样不断细分&#xff0c;缩小范围进行同…

flink主要组件及高可用配置

背景 flink不论运行在哪种环境&#xff0c;例如Yarn&#xff0c;Mesos&#xff0c;Kebernute以及独立集群&#xff0c;每个应用都会包含重要的几个组件&#xff0c;本文就来讲述下flink的主要组件以及如何实现flink的高可用配置 flink主要组件 如图所示&#xff0c;flink主要…

TiDB 7.1 资源管控特性试用

作者&#xff1a; 啦啦啦啦啦 原文来源&#xff1a; https://tidb.net/blog/3ddb423a 一.背景 印象里 2022 年初的时候就有小伙伴在 asktug 提出 TiDB 未来是否会有多租户功能的问题了&#xff0c;没想到这么快就已经 GA 了。资源管控特性&#xff08;Resource Control&…

【论文阅读】Weighted Boxes Fusion(WBF)模型融合原理解读

论文地址&#xff1a;https://arxiv.org/pdf/1910.13302.pdf 代码地址&#xff1a;GitHub - ZFTurbo/Weighted-Boxes-Fusion: Set of methods to ensemble boxes from different object detection models, including implementation of "Weighted boxes fusion (WBF)"…

chatgpt赋能python:Python中如何转化大小写

Python中如何转化大小写 在Python编程中&#xff0c;转化字符串的大小写是一个常见的操作。Python提供了内置函数和字符串方法来实现此操作。本文将介绍如何使用Python中的这些函数和方法来转换字符串的大小写。 使用内置函数str.upper()和str.lower() str.upper()函数将字符…

共创开源生态 | 小米肖翔荣获“2023中国开源优秀人物”奖

6月15-16日&#xff0c;以“开源创新 数字化转型 智能化重构”为主题的“第十八届开源中国&#xff65;开源世界高峰论坛”在北京成功召开。小米工程师肖翔凭借其在 Apache 基金会的开源贡献及在操作系统领域内的技术突破&#xff0c;荣获“2023中国开源优秀人物”奖。 Xiaomi …

一文读懂候选边界框Selective Search、AnchorBased、Anchor Free

目标检测是计算机视觉中的一项重要任务&#xff0c;主要目的是在图像或视频中识别并定位感兴趣的对象。为了实现这一目标&#xff0c;目标检测算法通常会生成一系列候选边界框&#xff0c;这些框包围了图像中可能存在的目标对象。候选边界框技术对于减少目标检测的计算复杂度和…