Spring Boot 2.0 WebFlux 教程 (一) | 入门篇
目录
一、什么是 Spring WebFlux
二、WebFlux 的优势&性能
三、WebFlux 应用场景
四、适用性
五、快速入门
5.1 添加 webflux 依赖
5.2 定义接口
5.3 测试接口
六、总结
七、GitHub 示例代码
一、什么是 Spring WebFlux
下图截自 Spring Boot 官方网站:
结合上图,在了解 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 MVC 和 Spring WebFlux 的相同点和不同点:
相同点:
- 都可以使用 Spring MVC 注解,如
@Controller
, 方便我们在两个 Web 框架中自由转换; - 均可以使用 Tomcat, Jetty, Undertow Servlet 容器;
- …
注意点:
- Spring MVC 因为是使用的同步阻塞式,更方便开发人员编写功能代码,Debug 测试等,一般来说,如果 Spring MVC 能够满足的场景,就尽量不要用 WebFlux,因为转向非阻塞响应式编程学习曲线是陡峭的,小组成员的学习成本要考量进来;
- WebFlux 默认情况下使用 Netty 作为服务器;
- 在微服务架构中,Spring MVC 和 WebFlux 可以混合使用,比如,对于那些 IO 密集型服务(如网关),我们就可以使用 WebFlux 来实现。
五、快速入门
5.1 添加 webflux 依赖
新建一个 Spring Boot 项目,新建步骤可参考笔者另一篇博文《Spring Boot 入门教程 | 图文讲解》,在 pom.xml
文件中添加 webflux
依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
5.2 定义接口
新建一个 controller
包,用来放置对外的接口类,再创建一个 HelloWebFluxController.class
类,定义两个接口:
package site.exception.springbootwebfluxhello.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
import site.exception.springbootwebfluxhello.entity.User;/*** @author 犬小哈 (微信号: 小哈学Java)* @site 个人网站: www.exception.site* @date 2019/4/15* @time 下午9:12* @discription**/
@RestController
public class HelloWebFluxController {@GetMapping("/hello")public String hello() {return "Hello, WebFlux !";}@GetMapping("/user")public Mono<User> getUser() {User user = new User();user.setName("犬小哈");user.setDesc("欢迎关注我的公众号: 小哈学Java");return Mono.just(user);}}
User.java
:
package site.exception.springbootwebfluxhello.entity;/*** @author 犬小哈 (微信号: 小哈学Java)* @site 个人网站: www.exception.site* @date 2019/4/15* @time 下午9:12* @discription**/
public class User {/*** 姓名*/private String name;/*** 描述*/private String desc;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}
以上控制器类中,我们使用的全都是 Spring MVC 的注解,分别定义了两个接口:
- 一个 GET 请求的
/hello
接口,返回Hello, WebFlux !
字符串。 - 又定义了一个 GET 请求的
/user
方法,返回的是 JSON 格式User
对象。
这里注意,User
对象是通过 Mono
对象包装的,你可能会问,为啥不直接返回呢?
在 WebFlux 中,Mono
是非阻塞的写法,只有这样,你才能发挥 WebFlux 非阻塞 + 异步的特性。
补充:在 WebFlux 中,除了
Mono
外,还有一个Flux
,这哥俩均能充当响应式编程中发布者的角色,不同的是:
Mono
:返回 0 或 1 个元素,即单个对象。Flux
:返回 N 个元素,即 List 列表对象。
5.3 测试接口
启动项目,查看控制台输出:
当控制台中输出中包含 Netty started on port(s): 8080
语句时,说明默认使用 Netty 服务已经启动了。
打开浏览器,先对 /user
接口发起调用:
返回成功。
再来对 /user
接口测试一下:
返回 JSON 格式的 User 实体也是 OK 的!
六、总结
本文中,我们学习了什么是 Spring WebFlux, 以及 WebFlux 的优势和应用场景,接下来我么将 WebFlux 与 Spring MVC 做了一下适用性比较,最后上手操作写了两个简单的接口,并测试成功了。
下一章中,我们将进一步学习,如何在 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
赠送 | 面试&学习福利资源
最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!
获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接,下面是目录以及部分截图:
重要的事情说两遍,获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接 !!!
欢迎关注微信公众号: 小哈学Java
Spring Boot 2.0 WebFlux 教程 (一) | 入门篇相关推荐
- Spring Boot 2.0 配置图文教程 1
Spring Boot 2.0 配置图文教程 摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义 ...
- Spring Boot 2.0 的配置详解(图文教程)
本文来自作者 泥瓦匠 @ bysocket.com 在 GitChat 上分享 「Spring Boot 2.0 的配置详解(图文教程)」 编辑 | 哈比 Spring Boot 配置,包括自动配置和 ...
- Spring Boot 2.0 配置图文教程
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 ...
- Spring Boot 2.0 配置图文教程第 2 章 Spring Boot 配置## 书信息 demo.book.name=[Spring Boot 2.x Core Action] demo.b
本章内容 1.自定义属性快速入门 2.外化配置 3.自动配置 4.自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 第 2 章 Spring B ...
- 聊聊 Spring Boot 2.0 的 WebFlux
https://zhuanlan.zhihu.com/p/30813274 首发于极乐科技 写文章登录 聊聊 Spring Boot 2.0 的 WebFlux 泥瓦匠BYSocket 4 个月前 聊 ...
- Spring Boot 2.x 基础教程: 快速入门
一.SpringBoot介绍 1.1 SpringBoot简介 SpringBoot是由Pivotal团队研发的,SpringBoot并不是一门新技术,只是将之前常用的Spring,SpringMVC ...
- Kotlin 企业级应用开发教程(Spring 5 + Spring Boot 2.0 + MyBatis)
Kotlin 企业级应用开发教程 -- Spring 5 + Spring Boot 2.0 + MyBatis 内容简介 Kotlin编程语言是一种现代语言,它简洁,安全,实用,同时专注于与Java ...
- Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional
Spring Boot 2.0 with Spring 5 Kotlin support and Spring WebFlux functional
- Spring基础:快速入门spring boot(7):spring boot 2.0简单介绍
从这篇文章开始以spring boot2为主要版本进行使用介绍. Spring boot 2特性 spring boot2在如下的部分有所变化和增强,相关特性在后续逐步展开. 特性增强 基础组件升级: ...
最新文章
- SAP MM 执行事务代码MRRL报错-No message was found for partner 100065 company code 0001-
- Oracle的控制文件
- Xamarin Essentials教程构建共享请求
- Facade Pattern
- 无限乱斗机器人ap出装_LOL:无限火力仅剩4天,这5个英雄一定要尝试!
- Oracle中的Union、Union All、Intersect、Minus
- limux php启动_linux下nginx与php设置开机启动代码
- 使用supervisor使Laravel的queue保持后台常驻
- 计算机主板用塑料做的好吗,电脑主板包装的塑料袋为什么是用透明胶封的,这样...-卓优商学问答...
- linux服务进程文件,[Linux实用命令]-6-服务与进程管理
- stringWithUTF8String return null (返回null)的解决办法
- python 最小二乘回归 高斯核_[数值计算] 数据拟合——非线性最小二乘法
- 因为计算机中丢失lua.dll,lua51.dll丢失修复
- 《击掌为盟》读后感1742字
- 用openCV取出图片中的四边形
- Centos 修改镜像源为阿里云
- ui平面设计好学吗?ui设计哪些工具是需要掌握的?
- 行人检测系统中的行人特征及检测方法
- 基于PHP使用rabbitmq实现消息队列
- 漳平市举行“宪法宣传周”法治主题毛笔书法创作大赛