Spring Boot 2.0简介

  • Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 java -jar 、SpringApplication 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。
  • 另外,Spring Boot 强调只需要很少的配置文件,所以在开发生产级 Spring 应用中,让开发变得更加高效和简易。目前,Spring Boot 版本是 2.x 版本,而且Spring Boot 包括 了WebFlux。

Spring Boot 2.0 WebFlux

Spring Boot 2.0 WebFlux

什么是 Reactive Streams?

  1. Reactive Streams 是 JVM 中面向流的库标准和规范
  2. 处理可能无限数量的元素
  3. 按顺序处理
  4. 组件之间异步传递
  5. 强制性非阻塞背压(Backpressure)

Backpressure(背压)

​ 背压是一种常用策略,使得发布者拥有无限制的缓冲区存储元素,用于确保发布者发布元素太快时,不会去压制订阅者。

Reactive Streams(响应式流)

  1. 发布者:发布元素到订阅者
  2. 订阅者:消费元素
  3. 订阅:在发布者中,订阅被创建时,将与订阅者共享
  4. 处理器:发布者与订阅者之间处理数据

什么是Reactive programming响应式编程?

​ 响应式编程是基于异步和事件驱动的非阻塞程序,只是垂直通过在 JVM 内启动少量线程扩展,而不是水平通过集群扩展,是一个编程范例。

Spring Webflux是由什么实现的

Spring Boot Webflux 就是基于 Reactor 实现的。Spring Boot 2.0 包括一个新的 spring-webflux 模块。该模块包含对响应式 HTTP 和 WebSocket 客户端的支持,以及对 REST,HTML 和 WebSocket 交互等程序的支持。

Reactor 一般提供两种响应式 API

  • Mono:实现发布者,并返回 0 或 1 个元素
  • Flux:实现发布者,并返回 N 个元素

Spring Boot Webflux 有两种编程模型实现,一种类似 Spring MVC 注解方式,另一种是使用其功能性端点方式。

Spring Boot 2.0 WebFlux 特性

响应式 API

​ Reactor 框架是 Spring Boot Webflux 响应库依赖,通过 Reactive Streams 并与其他响应库交互。
提供了 两种响应式 API : Mono 和 Flux。一般是将 Publisher 作为输入,在框架内部转换成 Reactor 类型并处理逻辑,然后返回 Flux 或 Mono 作为输出。

编程模型

​ Spring 5 web 模块包含了 Spring WebFlux 的 HTTP 抽象。类似 Servlet API , WebFlux 提供了 WebHandler API 去定义非阻塞 API 抽象接口。可以选择以下两种编程模型实现:
-注解控制层。和 MVC 保持一致,WebFlux 也支持响应性 @RequestBody 注解。
-功能性端点。基于 lambda 轻量级编程模型,用来路由和处理请求的小工具。和上面最大的区别就是,这种模型,全程控制了请求 – 响应的生命流程

内嵌容器

​ 跟 Spring Boot 大框架一样启动应用,但 WebFlux 默认是通过 Netty 启动,并且自动设置了默认端口为 8080。另外还提供了对 Jetty、Undertow 等容器的支持。开发者自行在添加对应的容器 Starter 组件依赖,即可配置并使用对应内嵌容器实例。但是要注意,必须是 Servlet 3.1+ 容器,如 Tomcat、Jetty;或者非 Servlet 容器,如 Netty 和 Undertow。

Spring Boot 2.0 WebFlux 组件

Spring Boot WebFlux 官方提供了很多 Starter 组件,每个模块会有多种技术实现选型支持,来实现各种复杂的业务需求:

  • Web:Spring WebFlux
  • 模板引擎:Thymeleaf
  • 存储:Redis、MongoDB、Cassandra、Mysql(r2dbc)
  • 内嵌容器:Tomcat、Jetty ; Netty(非 Servlet 容器)、Undertow(非 Servlet 容器)

Spring Webflux实践

开发运行环境要求:

  • JDK 1.8+ Spring Boot 2.x 要求 JDK 1.8 环境及以上版本。另外,Spring Boot 2.x 只兼容 Spring Framework 5.0 及以上版本。
  • Maven 3.2+ 为 Spring Boot 2.x 提供了相关依赖构建工具是 Maven,版本需要 3.2 及以上版本。
  • IntelliJ IDEA IntelliJ IDEA (简称 IDEA)是常用的开发工具,目前最新版本2020.3.2,推荐使用旗舰版,当然社区版也可以。

构建项目骨架

Spring Initializr 快速构建项目骨架
在浏览器中打开域名https://start.spring.io/,然后按照如下步骤操作:

build-springwebflux

  • 第一步,选择 Maven 或者 Gradle 构建工具,开发语言 Java 、Kotlin 或者 Groovy,最后确定 Spring Boot 版本号。
  • 第二步,输入 Maven 工程信息,即项目组 groupId 和名字 artifactId。这里对应 Maven 信息为:
    groupId:com.vincent
    artifactId:springboot-webflux-practise
    这里默认版本号 version 为 0.0.1-SNAPSHOT 。三个属性在 Maven 依赖仓库是唯一标识的。
  • 第三步,选择工程需要的 Starter 组件和其他依赖。最后点击生成按钮,即可获得骨架工程压缩包。这里快速入门,只要选择 Reactive Web 即可。

生成项目配置 POM 依赖检查

  • spring-boot-starter-webflux 依赖,是我们核心需要学习 webflux 的包,里面默认包含了 spring-boot-starter-reactor-netty 、spring 5 webflux 包。也就是说默认是通过 netty 启动的。
  • reactor-test、spring-boot-starter-test 两个依赖搭配是用于单元测试。
  • spring-boot-maven-plugin 是 Spring Boot Maven 插件,可以运行、编译等调用。

springboot-webflux-practise

build-springwebflux-02.png

springboot-webflux-practise是webflux的一个学习练习demo工程.

  1. 其中Spring WebFlux有两种版本:基于功能和注释。

  2. CURD的demo(mysql)

  3. WebFlux集成Thymeleaf

  4. WebFlux集成redis

  • 基于注释非常接近Spring MVC模型(CRUD):
    UserFluxController
  • 基于功能版本:
    HelloRouter,HelloHandler是路由处理
  • WebFlux集成Thymeleaf:
    UserThymleafController

  • webFlux集成redis:
    UserFluxReactiveController

  • 服务启动
    运行SpringbootWebfluxPractiseApplication的main()方法

    示例源码下载地址:https://github.com/leechaoqiang/springboot-webflux-practise