一文带您搞清什么是 Spring Boot 2.x WebFlux

Posted 小哈学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文带您搞清什么是 Spring Boot 2.x WebFlux相关的知识,希望对你有一定的参考价值。

目录

一、什么是 Spring WebFlux

二、WebFlux 的优势&提升性能?

三、WebFlux 应用场景

四、选 WebFlux 还是 Spring MVC?

五、异同点

六、简单看看 WebFlux 是如何分发请求的

七、快速入门

  • 7.1 添加 webflux 依赖

  • 7.2 定义接口

  • 7.3 测试接口

八、总结

九、GitHub 示例代码

一、什么是 Spring WebFlux

下图截自 Spring Boot 官方网站:

一文带您搞清什么是 Spring Boot 2.x WebFlux

结合上图,在了解 Spring WebFlux 之前,我们先来对比说说什么是 Spring MVC,这更有益我们去理解 WebFlux,图右边对 Spring MVC 的定义,原文如下:

Spring MVC is built on the Servlet API and uses a synchronous blocking I/O architecture whth a one-request-per-thread model.

翻译一下,意思如下:

Spring MVC 构建于 Servlet API 之上,使用的是同步阻塞式 I/O 模型,什么是同步阻塞式 I/O 模型呢?就是说,每一个请求对应一个线程去处理。

了解了 Spring MVC 之后,再来说说 Spring WebFlux:

上图左边,官方给出的定义如下:

Spring WebFlux is a non-blocking web framework built from the ground up to take advantage of multi-core, next-generation processors and handle massive numbers of concurrent connections.

翻译一下,内容如下:

Spring WebFlux 是一个异步非阻塞式的 Web 框架,它能够充分利用多核 CPU 的硬件资源去处理大量的并发请求。

二、WebFlux 的优势&提升性能?

WebFlux 内部使用的是响应式编程(Reactive Programming),以 Reactor 库为基础, 基于异步和事件驱动,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性。

看到这里,你是不是以为 WebFlux 能够使程序运行的更快呢?量化一点,比如说我使用 WebFlux 以后,一个接口的请求响应时间是不是就缩短了呢?

抱歉了,答案是否定的!以下是官方原话:

Reactive and non-blocking generally do not make applications run faster.

WebFlux 并不能使接口的响应时间缩短,它仅仅能够提升吞吐量和伸缩性。

三、WebFlux 应用场景

上面说到了, Spring WebFlux 是一个异步非阻塞式的 Web 框架,所以,它特别适合应用在 IO 密集型的服务中,比如微服务网关这样的应用中。

PS: IO 密集型包括:磁盘IO密集型, 网络IO密集型,微服务网关就属于网络 IO 密集型,使用异步非阻塞式编程模型,能够显著地提升网关对下游服务转发的吞吐量。

一文带您搞清什么是 Spring Boot 2.x WebFlux

四、选 WebFlux 还是 Spring MVC?

首先你需要明确一点就是:WebFlux 不是 Spring MVC 的替代方案!,虽然 WebFlux 也可以被运行在 Servlet 容器上(需是 Servlet 3.1+ 以上的容器),但是 WebFlux 主要还是应用在异步非阻塞编程模型,而 Spring MVC 是同步阻塞的,如果你目前在 Spring MVC 框架中大量使用非同步方案,那么,WebFlux 才是你想要的,否则,使用 Spring MVC 才是你的首选。

在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如已经提到的,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。

选 WebFlux 还是 Spring MVC? This is not a problem!

咱不能为了装逼而装逼,为了技术而技术,还要考量到转向非阻塞响应式编程学习曲线是陡峭的,小组成员的学习成本等诸多因素。

总之一句话,在合适的场景中,选型最合适的技术。

五、异同点

一文带您搞清什么是 Spring Boot 2.x WebFlux

从上图中,可以一眼看出 Spring MVC 和 Spring WebFlux 的相同点和不同点:

相同点:

  • 都可以使用 Spring MVC 注解,如 @Controller, 方便我们在两个 Web 框架中自由转换;

  • 均可以使用 Tomcat, Jetty, Undertow Servlet 容器(Servlet 3.1+);

  • ...

注意点:

  • Spring MVC 因为是使用的同步阻塞式,更方便开发人员编写功能代码,Debug 测试等,一般来说,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux;

  • WebFlux 默认情况下使用 Netty 作为服务器;

  • WebFlux 不支持 mysql;

六、简单看看 WebFlux 是如何分发请求的

使用过 Spring MVC 的小伙伴们,应该到知道 Spring MVC 的前端控制器是 DispatcherServlet, 而 WebFlux 是 DispatcherHandler,它实现了 WebHandler 接口:

一文带您搞清什么是 Spring Boot 2.x WebFlux

来看看 DispatcherHandler类中处理请求的 handle 方法:

一文带您搞清什么是 Spring Boot 2.x WebFlux

  • ①: ServerWebExchange 对象中放置每一次 HTTP 请求响应信息,包括参数等;

  • ②:判断整个接口映射 mappings 集合是否为空,空则创建一个 Not Found 的错误;

  • ④:调用具体业务方法,也就是我们定义的接口方法;

  • ⑤:处理返回的结果;

七、快速入门

7.1 添加 webflux 依赖

新建一个 Spring Boot 项目,新建步骤可参考笔者另一篇博文《》,在 pom.xml 文件中添加 webflux 依赖:

 
   
   
 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-webflux</artifactId>

  4. </dependency>

7.2 定义接口

新建一个 controller 包,用来放置对外的接口类,再创建一个 HelloWebFluxController.class 类,定义两个接口:

 
   
   
 
  1. package site.exception.springbootwebfluxhello.controller;


  2. import org.springframework.web.bind.annotation.GetMapping;

  3. import org.springframework.web.bind.annotation.RestController;

  4. import reactor.core.publisher.Mono;

  5. import site.exception.springbootwebfluxhello.entity.User;


  6. /**

  7.  * @site 个人网站: www.exception.site

  8. * @date 2019/4/15

  9.  * @time 下午9:12

  10. * @discription

  11. **/

  12. @RestController

  13. public class HelloWebFluxController {


  14. @GetMapping("/hello")

  15. public String hello() {

  16. return "Hello, WebFlux !";

  17. }


  18. @GetMapping("/user")

  19. public Mono<User> getUser() {

  20. User user = new User();

  21. user.setName("犬小哈");

  22. return Mono.just(user);

  23. }



  24. }

User.java:

 
   
   
 
  1. package site.exception.springbootwebfluxhello.entity;


  2. /**

  3.  * @site 个人网站: www.exception.site

  4. * @date 2019/4/15

  5.  * @time 下午9:12

  6. * @discription

  7. **/

  8. public class User {


  9. /**

  10. * 姓名

  11. */

  12. private String name;

  13. /**

  14. * 描述

  15. */

  16. private String desc;


  17. public String getName() {

  18. return name;

  19. }


  20. public void setName(String name) {

  21. this.name = name;

  22. }


  23. public String getDesc() {

  24. return desc;

  25. }


  26. public void setDesc(String desc) {

  27. this.desc = desc;

  28. }

  29. }

以上控制器类中,我们使用的全都是 Spring MVC 的注解,分别定义了两个接口:

  • 一个 GET 请求的 /hello 接口,返回 Hello,WebFlux!字符串。

  • 又定义了一个 GET 请求的 /user方法,返回的是 JSON 格式 User 对象。

这里注意, User 对象是通过 Mono 对象包装的,你可能会问,为啥不直接返回呢?

在 WebFlux 中, Mono 是非阻塞的写法,只有这样,你才能发挥 WebFlux 非阻塞 + 异步的特性。

补充:在 WebFlux 中,除了 Mono 外,还有一个 Flux,这哥俩均能充当响应式编程中发布者的角色,不同的是:

  • Mono:返回 0 或 1 个元素,即单个对象。

  • Flux:返回 N 个元素,即 List 列表对象。

7.3 测试接口

启动项目,查看控制台输出:

一文带您搞清什么是 Spring Boot 2.x WebFlux

当控制台中输出中包含 Nettystarted on port(s):8080 语句时,说明默认使用 Netty 服务已经启动了。

打开浏览器,先对 /user 接口发起调用:

一文带您搞清什么是 Spring Boot 2.x WebFlux

返回成功。

再来对 /user 接口测试一下:

一文带您搞清什么是 Spring Boot 2.x WebFlux

返回 JSON 格式的 User 实体也是 OK 的!

八、总结

本文中,我们学习了什么是 Spring WebFlux, WebFlux 的优势和应用场景,接下来我们谈了谈在生产环境中技术选型该选 WebFlux 还是 Spring MVC, 两者之间又有什么异同点,以及从源码角度了解了 WebFlux 是如何分发请求的。

最后上手操作写了两个简单的接口,并测试成功了。

下一章中,我们将进一步学习,如何在 WebFlux 中对数据库做增删改查操作,敬请期待吧!

九、GitHub 示例代码

https://github.com/weiwosuoai/spring-boot-tutorial/tree/master/spring-boot-webflux-hello

十、Ref

  • https://spring.io/

  • https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html

  • https://www.ibm.com/developerworks/cn/java/spring5-webflux-reactive/index.html

  • https://openhome.cc/Gossip/Spring/WebFlux.html

赠送面试&学习福利资源

最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

一文带您搞清什么是 Spring Boot 2.x WebFlux

一文带您搞清什么是 Spring Boot 2.x WebFlux

一文带您搞清什么是 Spring Boot 2.x WebFlux

一文带您搞清什么是 Spring Boot 2.x WebFlux

一文带您搞清什么是 Spring Boot 2.x WebFlux

一文带您搞清什么是 Spring Boot 2.x WebFlux

·END·


 近期热文:









如果你喜欢本文

请长按二维码,关注小哈学Java


看完,赶紧点个“在看”鸭

点鸭点鸭

↓↓↓↓


以上是关于一文带您搞清什么是 Spring Boot 2.x WebFlux的主要内容,如果未能解决你的问题,请参考以下文章

一文带您快速入门可视化分析平台 Kibana

原创 | 一文带您快速入门可视化分析平台 Kibana

Spring Boot 2.x教程-Thymeleaf 原理是什么

Spring Boot一文带你了解Spring Boot写的太详细了!

Spring Boot 2.X:Spring Boot 集成 Redis

Spring Boot 2.X:入门篇