Redian新闻
>
别只会 SpringMVC 了!Spring 又官宣了一个更牛逼的替代框架!

别只会 SpringMVC 了!Spring 又官宣了一个更牛逼的替代框架!

公众号新闻

来源: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项目已经正常工作了。

END

官方站点:www.linuxprobe.com

Linux命令大全:www.linuxcool.com

刘遄老师QQ:5604241

Linux技术交流群:3762708

(新群,火热加群中……)

想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【周末综艺会6期】Spring Garden Show 和板蓝花儿开原研哉新作“神了”,秋裤+秋衣简单粗暴,不吹不贬,真的是很牛逼的设计你还在用 top ?这有几个更牛逼的选择!少走点弯路吧。。。珍贵的官宣了!斯里兰卡归国不用再核酸,试剂盒自测替代!世行:去年斯国50万人失业36岁杨幂又官宣了!离婚真相的背后,是她令人羡慕的底气硅的替代材料,新突破春节档破40亿!但它更牛逼,国产终于扬眉吐气!Spring break别只会穿T恤了!入夏第一件“天丝衫”,防晒又高级!为什么 Nginx 比 Apache 更牛叉?最牛逼的 Java 框架,不接受反驳!!昂纳克的教堂鸡蛋别只会水煮!学会这几招,连吃1周不重样任正非:华为三年完成13000多颗器件的替代开发这款文件传输工具的替代品,牛逼了!抖音电商扶植「商城」见效,GMV占比已达三成|Long China 50独家官宣了!美籍赴华十年签证恢复使用了!|北美候鸟37岁杨幂又官宣了,离婚真相首次曝光:她的成功却让我看到现实的残酷和无奈37岁杨幂又官宣了,离婚真相不再隐瞒:她的成功打脸了多少人...“气候福利金”!加拿大又官宣发钱了,每人可拿$1000+!找个借口就发钱?枫叶国想说不爱有点难!英国伦敦爱丁堡带孩子游记 Spring 2023聊一款续航牛逼的轻薄本天赋“易昺(bǐng)”,创造历史!Agustín Hernández:中美洲建筑背景下的未来主义巨构Spring循环依赖那些事儿(含Spring详细流程图)官宣了,他们终于官宣了!什么都嗑只会害了你?不会!只会让我营养均衡!横跨隆达深渊之上的老拱桥--西班牙Andalusia文革是毛泽东第二次逼上井岗山第二次徒步圣路,750公里葡萄牙之路+英国之路:D27~途中买鞋上汽大众官宣吴磊;鸭鸭2023GMV目标150亿;HEDONE京东店将关闭…| 刀法品牌热讯妥了...还是SpringBoot够牛逼!全球第一!刚刚,澳洲又官宣一项全新福利计划!千万家庭即将受益!打卡,Goodbye Spring BreakChatGPT的替代品来了!HuggingChat号称媲美GPT-3.5,要拆掉OpenAI的围墙1个牛逼的思路读文献像刷朋友圈?30分钟读懂,还能扒出框架!这个方法绝了!Redis 可别只会用缓存!这 16 种妙用让同事直呼牛X
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。