专栏首页晓月寒·Spring Boot从入门到精通-使用WebFlux进行响应式编程(1)

Spring Boot从入门到精通-使用WebFlux进行响应式编程(1)

响应式编程范式为开发高性能 Web 应用带来了新的机会和挑战。Spring 5 中的 WebFlux 模块可以作为开发响应式 Web 应用的基础。由于 Spring 框架的流行,WebFlux 会成为开发 Web 应用的重要趋势之一。

在进行WebFlux开发之前,我们需要先了解WebFlux以及什么是响应式编程。

WebFlux使用异步非阻塞的方式,可以极大地提高系统的吞吐量。WebFlux只能运行在 Servlet 3.1+ 容器,因为3.1 规范其中一个新特性是异步处理支持。Spring Boot 2是基于Spring 5构建而成,因此只有在Spring Boot 2.x 中才能使用WebFlux 。WebFlux 支持的容器有 Tomcat、Jetty(Non-Blocking IO API) ,也可以像 Netty 和 Undertow 的本身就支持异步容器。在容器中 Spring WebFlux 会将输入流适配成 Mono 或者 Flux 格式进行统一处理。

WebFlux中的Flux和Mono
  • Flux 和 Mono 是 Reactor 中的两个基本概念。Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法 onNext(), onComplete()和 onError()会被调用。 Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中同样可以包含与 Flux 相同的三种类型的消息通知。Flux 和 Mono 之间可以进行转换。对一个 Flux 序列进行计数操作,得到的结果是一个 Mono对象。把两个 Mono 序列合并在一起,得到的是一个 Flux 对象。

响应式编程是基于异步和事件驱动的非阻塞程序,在响应式程序收到前端发送的请求之后,会将这个请求交由其他的线程去执行,当执行完成之后再异步通知给前端。

例如,在以往的编程方式中,定义了一个变量a=b+c。b和c在以后的程序中发生了变化,但是a的值却还是开始的值;但是在响应式编程中a的值却依然可以根据b和c进行改变。

在本小节中,我们将使用与以往Spring MVC不同的方式,以WebFlux在Spring Boot 2中构建一套restful接口。 首先搭建一个Spring Boot 2项目。在pom.xml中引入依赖:

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

新建controller文件夹,在controller文件夹下新建UserRestController.java

package com.xyh.webflux.controller;

import com.xyh.webflux.model.User;
import com.xyh.webflux.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping(value = "/user")
public class UserRestController {

    @RequestMapping(method = RequestMethod.GET)
    public Mono<String> findAllUser() {
        return Mono.just("Hello World");
    }
}

启动项目,在浏览器中输入localhost:8080/user,可以看到"Hello World"字样。说明我们确实用了一种与以往不同的方式实现了一个更加强大的接口。但这只是一个最简单的例子,WebFlux能实现的远不止于此,接下来我们将继续深入探究WebFlux的更多强大的功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot实战-使用WebFlux进行响应式编程(2)

    以上代码使用Map完成了关于用户的增删改查操作。这也是我们在项目中运用最多的操作。如果只是想要在完成时给出完成信号,就可以使用 Mono<Void>。 接下来...

    我的小熊不见了丶
  • Spring Boot从入门到精通-集成mybatis

    我的小熊不见了丶
  • java8之行为参数化,你用了吗?

    java8新增加了方法引用::语法(将方法作为参数)。将方法的引用传递进去,可以极大地简化你的代码。

    我的小熊不见了丶
  • Jmeter系列(23)- 详解 HTTP 信息头管理器

    Flask-json 接口独享的信息头:content-type、Accept-Charset、Accept-Encoding

    小菠萝测试笔记
  • Mono 2.0正式发布了

    Mono官网:http://mono-project.com/ 2.0 Release Notes: http://www.mono-project.com/...

    张善友
  • Confluence 6 评论一个文件

    无论是一个图片 —— 例如一个模拟的新市场计划需要反馈,还是一个 PDF 文件,一个演讲稿,或者任何你可以在 Confluence 中预览的文件。你可以在预览的...

    HoneyMoose
  • LeetCode 974. 和可被 K 整除的子数组(哈希map)

    给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。

    Michael阿明
  • Confluence 6 评论一个文件

    无论是一个图片 —— 例如一个模拟的新市场计划需要反馈,还是一个 PDF 文件,一个演讲稿,或者任何你可以在 Confluence 中预览的文件。你可以在预览的...

    HoneyMoose
  • 利用HSTS嗅探浏览器历史纪录的三个漏洞

    HSTS是让浏览器强制使用HTTPS访问网站的一项安全策略。HSTS的设计初衷是缓解中间人攻击带来的风险。本文主要介绍HSTS及其他Web功能带来的一些隐私问题...

    FB客服
  • php中用unset销毁变量并释放内存

    PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变量占用的内存!

    砸漏

扫码关注云+社区

领取腾讯云代金券