Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!

这篇具有很好参考价值的文章主要介绍了Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring-webflux简介

spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架,大量测评证明,使用WebFlux开发接口能够大幅提升接口的吞吐量。

这个框架包含了spring-framework和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用spring-webmvc和spring-webflux,或者只用其中一个来开发web应用。

什么是“响应式”

所谓响应式,举个例子,当调用一个api获取数据时,无需阻塞等待数据返回,而是当有数据返回时会进行告知。可见响应式是非阻塞的,意味着调用方法后,CPU可以去做别的事情,当接收到数据响应时CPU再回来处理,这种方式提高了系统的吞吐量。

而响应式编程,其实是为这种异步非阻塞的流式编程制定的一套标准。流式编程已不陌生了,Java8提供的stream api就是这种风格。这套标准包括对运行环境(JVM、JavaScript)以及网络协议相关的规范。

Spring-webflux的响应式API

Spring-webflux框架是基于Reactor这个开源项目开发的。Reactor框架是跟Spring紧密配合的。

它提供了两种API类型,分别是Mono和Flux;

// Mono一般作用于单个对象
Mono<Person> person = personDao.getPerson(personId);
// Flux一般作用于多个对象
Flux<Person> people = personDao.listAllPeople();

尽管webflux框架基于Reactor,它也能与其他的响应式框架同时使用,比如RxJava。

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

选择Spring-webmvc还是Spring-webflux呢

这两个web框架分别代表着两种不同类型的编程流派,官方给出了一个图作为对比如下

Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!

根据官方的建议有以下几点可以作为参考:

  • 如果你已经使用了Spring-webmvc进行开发,并且项目运行良好,就无需更改了;何况现在大多数的三方库都是阻塞的,并不能发挥出非阻塞的优势。
  • webflux提供了相当多的选择;在服务层,可以使用(Netty, Tomcat, Jetty, Undertow, 和3.1版本以上的Servlet容器)作为web服务;在应用层,可以选择用@Controller定义还是使用函数编程定义;在编程风格上,可以选择用Reactor、RxJava或其他。
  • 如果你钟爱Java8提供的lambda表达式这种轻量级、函数式的编程风格,那么建议选择用webflux;同时对于一些轻量级应用,或者复杂度比较低的微服务,建议使用webflux以便更好的进行控制。
  • 在微服务架构中,可以将webmvc和webflux项目混合使用。两个框架都可以使用@Controller这种注解的方式,使得项目的重用更加容易。
  • 评估一个项目是否应该选择webflux的最简单的方式是,依据项目中是否会使用很多的阻塞API,比如JDBC或者一些阻塞式的API就不适用与webflux项目。
  • 如果一个webmvc项目中有很多的外部系统调用,可以试试响应式的WebClient,它能直接从Controller的方法中返回响应式结果。
  • 响应式编程的学习路线是比较陡峭的,所以如果你身在一个大型的团队中,要考虑投入的成本;不过可以用用WebClient来体验下响应式编程。

Spring-webflux不仅可以支持在Tomcat、Jetty以及3.1版本以上的Servlet容器上,还能够运行在非Servlet的服务器之上,比如Netty、Undertow等。

使用Springboot构建一个webflux应用,默认就是使用Netty,因为Netty本身就是非阻塞式的实现。

并发模型

尽管webmvc和webflux都支持使用注解来定义一个Controller,但是其实现方式完全不同。

webmvc是一个Servlet应用,实现是阻塞式IO,其维护一个线程池来处理每一个用户请求,也就是当Servlet容器启动时,就会创建比如10个线程出来,因此系统吞吐量的瓶颈在于有限的连接数和阻塞的请求处理过程。

webflux可以基于netty这样的NIO网络框架,它只需要很少的几个工作线程(Event loop worker)就能够处理并响应请求。由于无需阻塞等待方法返回,CPU资源就得到了更好的利用。

webflux并不能让程序运行地更快;而是提高了并发处理请求的能力,即提高了系统吞吐量。

webflux代码示例

Talk is cheap, show me the code

下面让我们来看一下webflux的示例,总的来说使用上是非常便捷的。

我们用Springboot构建一个webflux应用非常简单,仅仅需要加入这么一个依赖

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

首先定义一个对象

public class Person {
    private Integer id;
    private Integer age;
    private String name;
}

然后定义“PersonController”,响应式风格中不再使用@RequestMapping声明地址映射了,而是通过RouterFunctions.route().GET()方法

@Configuration
public class PersonRouter {
    @Resource
    private PersonHandler personHandler;
    @Bean
    public RouterFunction<ServerResponse> personRoutes() {
        return RouterFunctions.route()
                .GET("/person/{id}", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::getPerson)
                .GET("/person", RequestPredicates.accept(MediaType.APPLICATION_JSON), personHandler::listPeople)
                .POST("/person", personHandler::createPerson)
                .build();
    }
}

在PersonHandler中处理对应的HTTP请求,等同于MVC架构中的Service层

@Component
public class PersonHandler {

    @Resource
    private PersonRepository personDao;

    public Mono<ServerResponse> listPeople(ServerRequest request) {
        Flux<Person> people = personDao.listAllPeople();
        return ServerResponse.ok()
                .contentType(MediaType.APPLICATION_JSON)
                .body(people, Person.class);
    }

    public Mono<ServerResponse> createPerson(ServerRequest request) {
        Mono<Person> person = request.bodyToMono(Person.class);
        return ServerResponse.ok()
                .build(personDao.savePerson(person));
    }

    public Mono<ServerResponse> getPerson(ServerRequest request) {
        int personId = Integer.parseInt(request.pathVariable("id"));
        return personDao.getPerson(personId)
                .flatMap(person -> ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).bodyValue(person))
                .switchIfEmpty(ServerResponse.notFound().build());
    }

}

通过启动日志可以证实Spring-webflux是默认使用Netty提供HTTP服务

Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!

项目启动之后浏览器访问http://localhost:8080/person/1就能发现,你的Spring-webflux项目已经正常工作了。

原文链接:https://blog.csdn.net/yasin_huang/article/details/106556935

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-505164.html

到了这里,关于Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 记录--你的代码不堪一击!太烂了!

    小王,你的页面白屏了,赶快修复一下。小王排查后发现是服务端传回来的数据格式不对导致,无数据时传回来不是 [] 而是 null , 从而导致 forEach 方法报错导致白屏,于是告诉测试,这是服务端的错误导致,要让服务端来修改,结果测试来了一句:“服务端返回数据格式错误

    2024年02月16日
    浏览(25)
  • 【Spring教程29】Spring框架实战:从零开始学习SpringMVC 之 服务器响应知识全面详解

    欢迎大家回到《Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《SpringMVC 之 请求与请求参数详解》 上一节我们说了SpringMvc请求知识,这一节

    2024年02月03日
    浏览(66)
  • Spring WebFlux 的详细介绍

    Spring WebFlux 是基于响应式编程的框架,用于构建异步、非阻塞的 Web 应用程序。它是Spring框架的一部分,专注于支持响应式编程范式,使应用程序能够高效地处理大量的并发请求和事件。   以下是关于 Spring WebFlux 的详细介绍:   1. **响应式编程**:    Spring WebFlux 使用响应式

    2024年02月12日
    浏览(30)
  • spring-webflux5 使用websocket

    换做平常springboot程序中使用websocket的话是很简单的,只需要三步就能实现前后端的实时通讯。而在spring5中则更简单了,并且支持定点推送与全推送的灵活运用。在这里就分常规编程与响应式编程两种使用,进行记录下。 WebFlux 本身就提供了对 WebSocket 协议的支持,处理 WebS

    2024年02月15日
    浏览(46)
  • 一次搞清Spring 、Spring Boot、Spring Web MVC、Spring WebFlux

    介绍Spring生态系统,辨析Spring、Spring Boot、Spring Web MVC和Spring WebFlux。 微信搜索关注《Java学研大本营》 在软件开发中,应用框架为代码库提供基础设施支持,使编程更容易。Spring是Java领域最受欢迎的开源应用框架。Spring由多个模块和附加组件组成,术语“Spring”通常用来指代

    2024年02月19日
    浏览(40)
  • 【汇总】解决Spring-Web与Spring-WebFlux冲突

    创捷了 Spring-Web 项目,然后在学习 Spring-WebFlux 的时候代码编写后请求解决报404,示例代码如下: pom依赖文件 启动成功后,请求如图 然后进行一系列的问题排查 Spring MVC 和 Spring WebFlux 是两个不同的框架,用于构建 Web 应用程序。由于这两个框架之间的差异,建议一个项目只用

    2024年04月16日
    浏览(39)
  • Spring Boot 3.0系列【23】应用篇之集成Spring WebFlux

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.4 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 官方文档地址 Spring MVC 是 Spring 专门为 Servlet API 和 Servlet 容器而设计的 Web 框架, 在 5.0 版本中加入了基于响应式的 Web 框架 Spring WebFlux ,它是完全 非阻

    2023年04月14日
    浏览(40)
  • 50、Spring WebFlux 的 自动配置 的一些介绍,与 Spring MVC 的一些对比

    Spring WebFlux 简称 WebFlux ,是 spring5.0 新引入的一个框架。 SpringBoot 同样为 WebFlux 提供了自动配置。 Spring WebFlux 和 Spring MVC 是属于竞争关系,都是框架。在一个项目中两个也可以同时存在。 SpringMVC 是基于 Servlet API 的, 是属于同步的框架,就是有请求过来,SpringMVC 去获取请求

    2024年02月09日
    浏览(47)
  • 微服务系列-使用WebFlux的WebClient进行Spring Boot 微服务通信示例

    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。 在之前的教程中,我们看到了使用 RestTemplate 的 Spring Boot 微服务通信示例。 从 5.0 开始,RestTemplate处于维护模式,很快就会被弃用。因此 Spring 团队建议使用 org.springframework.web.reactive.clien

    2024年02月05日
    浏览(52)
  • Spring WebFlux 实现同一个方法在短时间内只执行一次

    要在 Spring WebFlux 中实现同一个方法在短时间内只执行一次,你可以使用一种常见的技术,即通过限制并发访问来保证只有一个请求能够执行。 以下是一种可能的实现方式: 使用 AtomicBoolean 进行标记:在你的方法中,声明一个 AtomicBoolean 类型的变量,用于标记方法是否已经在

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包