Skip to content

SpringBoot2.0使用Spring WebFlux之HelloWord教程

zhuoqianmingyue edited this page Jun 15, 2019 · 3 revisions

查看示例程序说明

使用Spring WebFlux之HelloWord教程 在master分支上查看 master lesson16_spring_webflux

Reactive Programming和Reactive Streams 以及 Spring Webflux 介绍


关于Reactive Programming和Reactive Streams自己搜索大量文章都介绍的朦朦胧胧的,不过在我的努力下终于找到了2个博主的博客介绍的非常好。正如孔子所说:述而不作,我这里就不在进行自己的理解的介绍了。直接引用好的介绍来说明。说了这么多我现在隆重介绍一下2个博主他们分别是:

csdn 博主 享学IT 关于Reactive Programming和Reactive Streams介绍如下:

响应式编程通常作为面向对象编程中的“观察者模式”(Observer design pattern)的一种扩展。 响应式流(reactive streams)与“迭代子模式”(Iterator design pattern)也有相通之处, 因为其中也有 Iterable-Iterator 这样的对应关系。主要的区别在于,Iterator 是基于 “拉取”(pull)方式的,而响应式流是基于“推送”(push)方式的。

使用 iterator 是一种“命令式”(imperative)编程范式,因为什么时候获取下一个元素取决于开发者。在响应式流中,相对应的角色是“发布者 - 订阅者”(Publisher-Subscriber),当有新的值到来的时候,反过来由发布者(Publisher) 通知订阅者(Subscriber),这种“推送”模式是响应式的关键。此外,对推送来的数据的操作 是通过一种声明式(declaratively)而不是命令式(imperatively)的方式表达的:开发者通过 描述“处理流程”来定义对数据流的处理逻辑。

摘抄自:博主 享学IT 博客内容 关于Reactive Programming和Reactive Streams详细介绍请查看 该博主的写的非常好的博客进行过了解。文章介绍如下:

泥瓦匠BYSocket 博客中是这样介绍的:

了解 WebFlux ,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的库标准和规范:

处理可能无限数量的元素 按顺序处理 组件之间异步传递 强制性非阻塞背压(Backpressure)

Backpressure(背压)

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

Reactive Streams(响应式流) 一般由以下组成:

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

响应式编程

有了 Reactive Streams 这种标准和规范,利用规范可以进行响应式编程。那再了解下什么是 Reactive programming 响应式编程。响应式编程是基于异步和事件驱动的非阻塞程序,只是垂直通过在 JVM 内启动少量线程扩展,而不是水平通过集群扩展。这就是一个编程范例,具体项目中如何体现呢?

响应式项目编程实战中,通过基于 Reactive Streams 规范实现的框架 Reactor 去实战。Reactor 一般提供两种响应式 API :

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

Spring Webflux

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

Spring Boot Webflux 有两种编程模型实现

  1. Spring MVC 注解方式
  2. 使用其功能性端点方式

摘抄自:博主 泥瓦匠BYSocket 的博客: Spring Boot 2 快速教程:WebFlux 快速入门(二) 另外推荐一下 泥瓦匠BYSocket 关于SpringBoot的github项目:https://github.com/JeffLi1993/springboot-learning-example

SpringBoot2.0使用Spring WebFlux HelloWord


正所谓光说不练假把式,下面开始实战演示操作。

以下操作是自己参照 csdn 博主 享学IT 博客 (5)Spring WebFlux快速上手——响应式Spring的道法术器 一个练习的介绍。

首先第一步要先引入 webflux 的依赖

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

编写 webflux 访问的controller

@RestController
@RequestMapping("/webflux")
public class HelloWordWebFluxController {
	
	@RequestMapping("/helloworld")
	public Mono<String> helloWord(){
		return Mono.just("hello WebFlux!"); 
	}
}

最后启动SpringBoot 项目如下图所示 SpringBoot 默认使用的服务器是 Netty

在这里插入图片描述

我的SpringBoot的版本是:2.1.0.RELEASE

进行测试: 在这里插入图片描述

需要注意的是 如果使用Netty 服务器 那么在application.properties中配置的 server.servlet.context-path 是无效的。


# 使用指定服务器访问 WebFlux程序 ## 引入 spring-boot-starter-web使用的是tomcat
在pom 中同时引入 spring-boot-starter-web 默认使用的是tomcat 服务器。
<dependency>
<groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-webflux</artifactId>
  </dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

指定使用tomcat

如果想指定tomcat 服务器则需要在pom.xml中进行配置如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
<exclusions>
  <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
  </exclusion>
  <exclusion>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-reactor-netty</artifactId>
  </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>

指定使用jetty

如果想指定jetty 服务器则需要在pom.xml中进行配置如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
		
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-reactor-netty</artifactId>
   </exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

需要注意的是我们是可以在SpringBoot 既可以写SpringMVC 的程序也可以写Spring WebFlux 的程序。


参考文献:
https://docs.spring.io/spring/docs/current/spring-framework-reference/web-reactive.html#spring-webflux
https://blog.csdn.net/get_set/article/details/79466402
https://github.com/JeffLi1993/springboot-learning-example
http://hao.jobbole.com/reactive-streams/
https://blog.csdn.net/get_set/article/details/79480233