Spring Web vs Spring Webflux

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

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

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

下面是两个示例的代码:

Spring Web示例:

@RestControllerpublic 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.\\\"; }}
@Servicepublic 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示例:

@RestControllerpublic 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.\\\"); }}
@Servicepublic 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: 8080spring:  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: 8080spring:  data:    mongodb:      host: localhost      port: 27017      database: mydb      username: myusername

password: mypassword


原创文章,作者:小技术君,如若转载,请注明出处:https://www.sudun.com/ask/33845.html

Like (0)
小技术君的头像小技术君
Previous 2024年4月5日
Next 2024年4月5日

相关推荐

  • 微服务模式:业务服务模式

    无论是单体应用还是微服务,构建企业应用的业务逻辑/服务在更多方面上都有相似之处而不是差异。在两种方法中,都包含服务、实体、仓库等类。然而,也会发现一些明显的区别。在本文中,我将试图…

    CDN资讯 2024年4月13日
    0
  • 高防cdn如何检测攻击

    高防CDN(高防御内容分发网络)通常采用多种技术来检测攻击,以确保网络的稳定和安全。以下是一些常见的攻击检测方法: 综合利用这些技术和方法,高防CDN能够有效地检测和防御各种类型的…

    CDN资讯 2024年2月13日
    0
  • cdn是用来干嘛的,cdn用来干什么

    CDN是用来干嘛的?这个问题在当今互联网时代变得越来越重要。CDN,即内容分发网络,是一种通过在全球范围内分布的服务器网络来加速网络内容传输的技术。它的中心思想是通过将网站的静态资…

    2024年5月11日
    0
  • 使用CDN构建读取缓存设计

    在构建需要高吞吐量和最小响应时间的系统的API时,缓存几乎是不可避免的。每个在分布式系统上工作的开发人员都曾在某个时候使用过某种缓存机制。在本文中,我们将探讨如何使用CDN构建读取…

    2024年4月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注