Spring 赌上未来一击,推出响应式框架 WebFlux,代码更优雅,性能更强!
2023-06-28 17:18:37 博客园

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 = personDao.getPerson(personId);// Flux一般作用于多个对象Flux people = personDao.listAllPeople();

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

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

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

选择Spring-webmvc还是Spring-webflux呢

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

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

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

首先定义一个对象

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

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

@Configurationpublic class PersonRouter {    @Resource    private PersonHandler personHandler;    @Bean    public RouterFunction 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层

@Componentpublic class PersonHandler {    @Resource    private PersonRepository personDao;    public Mono listPeople(ServerRequest request) {        Flux people = personDao.listAllPeople();        return ServerResponse.ok()                .contentType(MediaType.APPLICATION_JSON)                .body(people, Person.class);    }    public Mono createPerson(ServerRequest request) {        Mono person = request.bodyToMono(Person.class);        return ServerResponse.ok()                .build(personDao.savePerson(person));    }    public Mono 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项目已经正常工作了。

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

近期热文推荐:

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

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

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

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

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

觉得不错,别忘了随手点赞+转发哦!

热门推荐

文章排行

  1. 2023-09-09户口异地怎么办离婚
  2. 2023-09-09国家统计局:8月份CPI同比上涨0.1% 环比上涨0.3%
  3. 2023-09-09曝张大大花千元约鲜肉体育生,现场杨幂满嘴荤段子,杨颖带小男友
  4. 2023-09-09教师编火热!记者调查:毕业生偏爱从教,为何“小城”更有吸引力?
  5. 2023-09-09王曼昱太争气!团赛被马琳弃用,单打却淘汰陈梦,或与孙颖莎争冠
  6. 2023-09-09刮骨疗毒什么意思解释(刮骨疗毒什么意思)
  7. 2023-09-08益生股份(002458.SZ):益生909小型白羽肉鸡现在的年产量约为8000万羽
  8. 2023-09-082023重庆质量月启动 将建立川渝首席质量官成员库
  9. 2023-09-08香油是什么油(关于香油是什么油的基本详情介绍)
  10. 2023-09-08发改委外资司举行中资境外债市场与政策交流会
  11. 2023-09-08年产150万吨光伏组件项目动工 江苏宿迁“千亿产业”再落一子
  12. 2023-09-08网上买手机号安全吗是真的吗(网上买手机号安全吗)
  13. 2023-09-08福建嘉越含金属废物资源化利用项目完成热负荷试生产工作
  14. 2023-09-08《宣州谢眺饯别校书云》原文(2023年09月08日宣州谢朓楼饯别校书叔云拼音版)
  15. 2023-09-08致欧科技:9月7日融资买入639.38万元,融资融券余额2438.1万元
  16. 2023-09-08特罗萨德:每周都在阿森纳经历激烈竞争,将为欧洲杯做好准备
  17. 2023-09-08围观现场起哄“不跳不是人” 人性不能如此丑陋
  18. 2023-09-08华晨宇快乐男声尚雯婕(华晨宇快乐男声)
  19. 2023-09-01和小米、三星卷拉美,“非洲之王”传音看到希望
  20. 2023-09-01第五届江西省专利奖获奖名单公布