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

赠送 | 面试&学习福利资源

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

获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接,下面是目录以及部分截图:

重要的事情说两遍,获取方式: 关注公众号: 小哈学Java, 后台回复 资源,既可获取资源链接 !!!

欢迎关注微信公众号: 小哈学Java

原文地址:https://www.cnblogs.com/quanxiaoha/p/10713782.html

时间: 2024-10-03 13:46:57

Spring Boot 2.0 WebFlux 教程 (一) | 入门篇的相关文章

Spring Boot 2.0.2 教程 - 目录

Spring Boot 2.0.2 教程 - Hello World - 01 Spring Boot 2.0.2 教程 - Hello World 之 intellij idea 创建web项目 - 02 Spring Boot 2.0.2 教程 - 配置文件application.properties - 03 Spring Boot 2.0.2 教程 - 日志管理 - 04 Spring Boot 2.0.2 教程 - 集成jsp和静态资源css,js,image的访问 - 05 Spri

Spring Boot 2.0 图文教程 | 集成邮件发送功能

文章首发自个人微信公众号: 小哈学Java 个人网站: https://www.exception.site/springboot/spring-boots-send-mail 大家好,后续会间断地奉上一些 Spring Boot 2.x 相关的博文,包括 Spring Boot 2.x 教程和 Spring Boot 2.x 新特性教程相关,如 WebFlux 等.还有自定义 Starter 组件的进阶教程,比如:如何封装一个自定义图床 Starter 启动器(支持上传到服务器内部,阿里 OS

阿里P9告诉你 Spring Boot 2.0正式发布,升还是不升呢?

Spring帝国Spring几乎是每一位Java开发人员都耳熟能详的开发框架,不论您是一名初出茅庐的程序员还是经验丰富的老司机,都会对其有一定的了解或使用经验.在现代企业级应用架构中,Spring技术栈几乎成为了Java语言的代名词,那么Spring为什么能够在众多开源框架中脱颖而出,成为业内一致认可的技术解决方案呢?我们不妨从最初的Spring Framework开始,看看它为什么能够横扫千军,一统江湖! 挑战权威,一战成名 2004年3月,Spring的第一个版本以及其创始人Rod John

Spring Boot 2.0(六):使用 Docker 部署 Spring Boot 开源软件云收

只需三步即可部署开源项目云收藏,打造专属个人的收藏系统,就是这么简单! 云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践. 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运行云收藏,但是仍然有很多的朋友不知道如何使用,如何部署?就像"请提供一份云收藏数据结构" 这样的问题我至少都回答了一百多次,并且在

Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南

前言Spring Boot已经发布2.0有满久了,多了很多新特性,一些坑也慢慢被填上,最近有空,就把本博客中Spring Boot干货系列对应的源码从1.5X升级到Spring Boot 2.0,顺便整理下升级的时候遇到的一些坑,做个记录.后续的教程就以最新的2.03版本为主.依赖 JDK 版本升级 2.x 至少需要 JDK 8 的支持,2.x 里面的许多方法应用了 JDK 8 的许多高级新特性,所以你要升级到 2.0 版本,先确认你的应用必须兼容 JDK 8. 另外,2.x 开始了对 JDK

Spring Boot 2.0 迁移指南

![img](https://mmbiz.qpic.cn/mmbiz_jpg/1flHOHZw6Rs7yEJ6ItV43JZMS7AJWoMSZtxicnG0iaE0AvpUHI8oM7lxz1rRsmaa4IfbolVRG2WQwhXrchmVWS8Q/640?tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) ### 前提 本文档将帮助您把应用程序迁移到 Spring Boot 2.0. ### 在你开始之前 首先,**Spring Boot 2.0需要Ja

Spring Boot 2.0(一):【重磅】Spring Boot 2.0权威发布

就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误,然后Spring Boot官方又赶紧把 GitHub 上发布的 v2.0.0.RELEASE 版本进行了撤回.到了下午将问题修复后,又重新进行了上传,至此Spring Boot2.0正式推出! 要知道这是Spring Boot1.0发布4年之后第一次重大修订,因此有多的新功能和特性值得大家期待!在S

spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

 前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环境中,并将其打包为Mac,Windows和Linux系统下的应用来实现这一目的. Electron于2013年作为构建Github上可编程的文本编辑器Atom的框架而被开发出来.这两个项目在2014春季开源. 目前它已成为开源开发者.初创企业和老牌公司常用的开发工具. 看看谁在使用Electron

Spring Boot 2.0深度实践之核心技术篇

第1章 系列总览总览 Spring Boot 2.0 深度实践系列课程的整体议程,包括 Spring Boot 三大核心特性(组件自动装配.嵌入式Web容?.生产准备特性).Web 应用(传统 Servlet.Spring Web MVC.Spring WebFlux).数据相关(JDBC.JPA.事务).功能扩展(SpringApplication.Spring Boot 配置.Spring Boot Starter)以及... 第2章 走向自动装配完整地讲述了 Spring Boot 是如何