0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring赌上未来的一击,响应式的WebFlux框架更优雅

jf_ro2CN3Fa 来源:CSDN 2023-06-21 14:42 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Spring-webflux简介

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

这个框架包含了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一般作用于单个对象
Monoperson=personDao.getPerson(personId);
//Flux一般作用于多个对象
Fluxpeople=personDao.listAllPeople();

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

选择Spring-webmvc还是Spring-webflux呢

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

ea8c3364-0fd3-11ee-962d-dac502259ad0.png

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

如果你已经使用了 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应用非常简单,仅仅需要加入这么一个依赖


org.springframework.boot
spring-boot-starter-webflux

首先定义一个对象

publicclassPerson{
privateIntegerid;
privateIntegerage;
privateStringname;
}

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

@Configuration
publicclassPersonRouter{
@Resource
privatePersonHandlerpersonHandler;
@Bean
publicRouterFunctionpersonRoutes(){
returnRouterFunctions.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
publicclassPersonHandler{

@Resource
privatePersonRepositorypersonDao;

publicMonolistPeople(ServerRequestrequest){
Fluxpeople=personDao.listAllPeople();
returnServerResponse.ok()
.contentType(MediaType.APPLICATION_JSON)
.body(people,Person.class);
}

publicMonocreatePerson(ServerRequestrequest){
Monoperson=request.bodyToMono(Person.class);
returnServerResponse.ok()
.build(personDao.savePerson(person));
}

publicMonogetPerson(ServerRequestrequest){
intpersonId=Integer.parseInt(request.pathVariable("id"));
returnpersonDao.getPerson(personId)
.flatMap(person->ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).bodyValue(person))
.switchIfEmpty(ServerResponse.notFound().build());
}

}

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

ea9860a8-0fd3-11ee-962d-dac502259ad0.png

项目启动之后浏览器就能发现,你的Spring-webflux项目已经正常工作了。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web服务器
    +关注

    关注

    0

    文章

    139

    浏览量

    25313
  • JAVA语言
    +关注

    关注

    0

    文章

    138

    浏览量

    21637
  • JDBC
    +关注

    关注

    0

    文章

    25

    浏览量

    13882
  • HTTP接口
    +关注

    关注

    0

    文章

    21

    浏览量

    2093

原文标题:Spring 赌上未来的一击,响应式的 WebFlux 框架更优雅,性能更强!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    英伟达5万亿市值背后,是未来的烧钱竞赛

    需求下,各大云计算厂商不断加大对AI算力基建的投资,大量购买算力卡。在10月29日的GTC大会上,英伟达CEO黄仁勋表示,公司新代AI芯片有望在未来几个季度创造高达5000亿美元的收入,远超市场预期。   5000亿美元的收入从何而来?在亚马逊、谷
    的头像 发表于 11-02 11:18 1.1w次阅读
    英伟达5万亿市值背后,是<b class='flag-5'>一</b>场<b class='flag-5'>赌</b><b class='flag-5'>上</b><b class='flag-5'>未来</b>的烧钱竞赛

    深入剖析MDS-100BPS18 BA医疗AC - DC开放框架电源

    - DC开放框架电源,它具有诸多出色的特性,能为医疗设备提供可靠的电力支持。 文件下载: MDS-100BPS18 BA.pdf 产品概述 MDS-100BPS18 BA是款18V、100W的医疗AC
    的头像 发表于 03-27 18:05 964次阅读

    LuatOS框架的使用(

    在资源受限的物联网终端设备中,如何实现快速开发与稳定运行是关键挑战。LuatOS框架通过将Lua语言与底层硬件抽象层深度融合,提供了套简洁高效的开发范式。本文将围绕LuatOS框架的使用展开,从
    的头像 发表于 01-27 19:38 329次阅读
    LuatOS<b class='flag-5'>框架</b>的使用(<b class='flag-5'>上</b>)

    个面向单片机、事件驱动的嵌入开发平台介绍

    、功能强大的软定时器,以时间事件的形式,对软定时器功能,进行优雅且功能强大的实现。 6、API的设计,更加简明,更加符合本土嵌入工程师的习惯。 7、移植方便,只需实现少数几个接口函数即可。 未来
    发表于 12-05 06:26

    使用xmake+zig更优雅的进行嵌入系统开发

    ,在嵌入领域采用现代化构建工具链已成为提升开发效率的趋势。LLVM在嵌入领域有两类应用方案:是由芯片厂商提供的平台专用集成工具链(如armclang、LLV
    的头像 发表于 11-30 10:04 4904次阅读
    使用xmake+zig<b class='flag-5'>更优雅</b>的进行嵌入<b class='flag-5'>式</b>系统开发

    PYQT 应用程序框架及开发工具

    大家好,本团队此次分享的内容为开发过程中使用到的PYQT 应用程序框架及开发工具。 pYqt 是个多平台的 python 图形用户界面应用程序框架,由于其面向对象、 易扩展(可实现组件编程等
    发表于 10-29 07:15

    能电气与中石油济柴签署框架合作协议

    近日,能电气股份有限公司(以下简称“能电气”)与中国石油集团济柴动力有限公司(以下简称“中石油济柴”)在上能电气总部签署框架合作协议。
    的头像 发表于 10-11 16:13 693次阅读

    嵌入工程师为什么要学QT?

    Qt对嵌入工程师来说,真的很重要吗? Qt是个跨平台的C++应用程序开发框架,非常适合嵌入系统的开发,Qt在嵌入开发中具有很重要的作
    发表于 08-14 15:15

    BitsButton嵌入按键处理框架

    BitsButton 、简介? ​​BitsButton是款针对嵌入系统优化的按键检测框架​​。通过创新的二进制位序列技术,它能高效处理单键、组合键(如Ctrl+C)和复杂按键
    发表于 08-02 11:24

    西井科技推出Hymala多联运物流枢纽大模型矩阵

    联运物流枢纽中多源需求、跨系统任务与多要素协同的全链路智能统筹难题,致力于构建具备深度思考与协同能力的物流“智能大脑”,以积极响应行业对于“高效化、绿色化”运营的迫切需求,引领智慧物流的
    的头像 发表于 07-29 17:49 1807次阅读

    Spring拦截器:你的请求休想逃过我的五指山!

    Spring框架中,拦截器(Interceptor)是种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring We
    的头像 发表于 07-26 11:25 791次阅读
    <b class='flag-5'>Spring</b>拦截器:你的请求休想逃过我的五指山!

    润和软件StackRUNS异构分布推理框架的应用案例

    江苏润和软件股份有限公司(以下简称“润和软件”)自主研发的StackRUNS异构分布推理框架已在实际场景中取得显著成效,成功应用于大型园区多模态模型演练及高校满血版DeepSeek-MoE 671B的运行,有效推动了大模型技术的快速落地。
    的头像 发表于 06-13 09:11 1421次阅读
    润和软件StackRUNS异构分布<b class='flag-5'>式</b>推理<b class='flag-5'>框架</b>的应用案例

    振弦渗压计的响应时间与测量频率解析

    在水利工程、岩土监测等领域,振弦渗压计是监测结构物内部渗透水压力的重要工具。其核心价值在于能够长期稳定地提供精准数据,帮助工程师评估工程安全状态。对于用户而言,了解其响应时间和测量频率的特性
    的头像 发表于 06-12 10:46 713次阅读
    振弦<b class='flag-5'>式</b>渗压计的<b class='flag-5'>响应</b>时间与测量频率解析

    CodeBuddy 打造响应图片画廊

    我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接: 腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 前段时间,我打算做响应
    的头像 发表于 05-11 13:33 734次阅读
    CodeBuddy 打造<b class='flag-5'>一</b>款<b class='flag-5'>响应</b><b class='flag-5'>式</b>图片画廊

    文读懂什么是电源瞬态响应

    您注意过在启动空调以后屋里的灯光瞬间变暗的情况吗?这是因为空调吸收了大量电流,致使供电电压下降,进而导致了灯光变暗。小段时间之后,电压还会恢复正常。直流电源的输出阻抗,也会造成类似的电压瞬变
    的头像 发表于 04-23 17:31 2094次阅读
    <b class='flag-5'>一</b>文读懂什么是电源瞬态<b class='flag-5'>响应</b>