求求你别只会springmvc了,太low了!spring又官宣了一个更牛逼的替代框架!(代码片段)

xhmj12 xhmj12     2022-12-08     469

关键词:

上一篇:人在新加坡,刚下飞机,原地失业!上交大佬刚到新加坡,就被虾皮取消了offer,作者发声了...

来源:blog.csdn.net/yasin_huang/

article/details/106556935

  • Spring-webflux简介

  • 什么是“响应式”

  • Spring-webflux的响应式API

  • 选择Spring-webmvc还是Spring-webflux呢

  • 并发模型

  • webflux代码示例


Spring-webflux简介

spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架。

这个框架包含了spring-framework和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。

你可以在项目中同时使用spring-webmvcspring-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-webmvc还是Spring-webflux呢

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

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

  • 如果你已经使用了 **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服务

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

求求你别在用for循环遍历list了,真的太low了!

推荐阅读:史上最污技术解读,我竟然秒懂了简介Java8API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表... 查看详情

别只会main方法做测试,太low!这才是专业java测试方法!

前言“"Ifyoucannotmeasureit,youcannotimproveit".在日常开发中,我们对一些代码的调用或者工具的使用会存在多种选择方式,在不确定他们性能的时候,我们首先想要做的就是去测量它。大多数时候,我们会简单的... 查看详情

只会springmvc了,太low了!spring又官宣了一个更牛逼的替代框架!

来源:blog.csdn.net/yasin_huang/article/details/106556935#Spring-webflux简介spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架。这个框架包含了spring-framework和springmvc,它可以运行在Netty、Undertow以及3.1版本以上的Se 查看详情

只会springmvc了,太low了!spring又官宣了一个更牛逼的替代框架

...编程风格的web开发框架。这个框架包含了spring-framework和springmvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可 查看详情

你别告诉我你还在用excel做数据透视分析吧,太low了!

来到大数据分析的时代,大量的大数据分析软件涌现,尽管如此,如果今天有人问起最常用的数据透视分析工具是什么的时候,我猜想Excel应该是大家的不二之选。 但是其实我想说,用现在的手机来打比方,Excel就好比老人... 查看详情

快来看看google出品的protocolbuffer,别只会用json和xml了

前言习惯用Json、XML数据存储格式的你们,相信大多都没听过ProtocolBufferProtocolBuffer其实是Google出品的一种轻量&高效的结构化数据存储格式,性能比Json、XML真的强!太!多!由于Google出品,我相信ProtocolBuffer已经具备足够的吸... 查看详情

同事:求求你别再这样用hashmap了

前言:我们都知道HashMap是线程不安全的,在多线程环境中,或者读写操作时不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7中的HashMap在jdk1.8中对HashMap做了很多优化,这里先分析在jdk1.7... 查看详情

求求你别乱脱敏了!mybatis插件+注解轻松实现数据脱敏,soeasy~!(代码片段)

问题在项目中需要对用户敏感数据进行脱敏处理,例如身份号、手机号等信息进行加密再入库。解决思路就是:一种最简单直接的方式,在所有涉及数据敏感的查询到对插入时进行密码加解密方法二:有方法一到出现对所有重大... 查看详情

求求你别再写上千行的类了,试试这些牛逼的重构技巧吧

点击关注公众号,实用技术文章及时了解来源:juejin.cn/post/6844904038383747086答应我,别再写上千行的类了好吗最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,开放了近40个public接口,我流... 查看详情

求求你别再写上千行的类了,试试这些牛逼的重构技巧吧(代码片段)

????????关注后回复 “进群” ,拉你进程序员交流群????????作者丨围军儿来源:juejin.cn/post/6844904038383747086答应我,别再写上千行的类了好吗最近在对已有项目进行扩展的时候,发现要改动的一个类它长766行,... 查看详情

怎么画出好的架构图,架构师必备技能

推荐阅读:求求你别在用for循环遍历list了,真的太low了!1.前言你是否对大厂展示的五花八门,花花绿绿的架构设计图所深深吸引,当我们想用几张图来介绍下业务系统,是不是对着画布不知从何下手࿱... 查看详情

如何把简单代码复杂化

...nt一句helloworld吧。main函数里print一下?太面向过程,太low了。得封装一个类。叫Printer.Printer有个成员方法,叫print。但是!光一个类太low了,以后要是有不同的实现怎么办?所以得加一个接口。PrinterInterface。但是!interface是没有... 查看详情

求求你别再做低级的码农了!计算机专业的必看,这样做才能有出路!

每年的六、七月都是高校的毕业季,也是应届大学生求职的高峰期。像程序员这个行业,其实程序员不一定是程序员,也有可能是码农、甚至码奴。像我也会收到私信,有人问我大学四年感觉自己学的不是很好... 查看详情

求求你别再做低级的码农了!计算机专业的必看,这样做才能有出路!

每年的六、七月都是高校的毕业季,也是应届大学生求职的高峰期。像程序员这个行业,其实程序员不一定是程序员,也有可能是码农、甚至码奴。像我也会收到私信,有人问我大学四年感觉自己学的不是很好... 查看详情

别再用system.currenttimemillis()统计耗时了,太low,stopwatch好用到爆!

背景你还在用System.currentTimeMillis...统计耗时?比如下面这段代码:/** * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void jdkWasteTime() throws InterruptedException     long start = System 查看详情

别再用system.currenttimemillis()统计耗时了,太low,stopwatch好用到爆!

点击关注公众号,Java干货及时送达背景你还在用System.currentTimeMillis...统计耗时?比如下面这段代码:/** * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void jdkWasteTime() throws InterruptedException    查看详情

别再用currenttimemillis统计耗时了,太low,试试stopwatch吧!(代码片段)

点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看文章来源:https://blog.csdn.net/duleilewuhen/article/details/114379693目录一、背景二、sprin... 查看详情

别再用currenttimemillis统计耗时了,太low,试试stopwatch吧!(代码片段)

点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看文章来源:https://blog.csdn.net/duleilewuhen/article/details/114379693目录一、背景二、sprin... 查看详情