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
什么是 Reactive Streams?
- Reactive Streams 是 JVM 中面向流的库标准和规范
- 处理可能无限数量的元素
- 按顺序处理
- 组件之间异步传递
- 强制性非阻塞背压(Backpressure)
Backpressure(背压)
背压是一种常用策略,使得发布者拥有无限制的缓冲区存储元素,用于确保发布者发布元素太快时,不会去压制订阅者。
Reactive Streams(响应式流)
- 发布者:发布元素到订阅者
- 订阅者:消费元素
- 订阅:在发布者中,订阅被创建时,将与订阅者共享
- 处理器:发布者与订阅者之间处理数据
什么是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/,然后按照如下步骤操作:
- 第一步,选择 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
springboot-webflux-practise是webflux的一个学习练习demo工程.
其中Spring WebFlux有两种版本:基于功能和注释。
CURD的demo(mysql)
WebFlux集成Thymeleaf
WebFlux集成redis
- 基于注释非常接近Spring MVC模型(CRUD):
UserFluxController- 基于功能版本:
HelloRouter,HelloHandler是路由处理WebFlux集成Thymeleaf:
UserThymleafControllerwebFlux集成redis:
UserFluxReactiveController服务启动
运行SpringbootWebfluxPractiseApplication的main()方法示例源码下载地址:https://github.com/leechaoqiang/springboot-webflux-practise