Spring Boot 2 快速教程:WebFlux 快速入门(二)

  • 时间:
  • 浏览:1
  • 来源:5分时时彩官网_线上5分时时彩投注平台_网络5分时时彩平台

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢!

文章工程:

  • JDK 1.8
  • Maven 3.5.2
  • Spring Boot 2.1.3.RELEASE
  • 工程名:springboot-webflux-1-quickstart
  • 工程地址:见文末

一、Spring Boot 2.0

spring.io 官网有句醒目得话是:

BUILD ANYTHING WITH SPRING BOOT

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

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

  • 处里原应着着无限数量的元素
  • 按顺序处里
  • 组件之间异步传递
  • 强制性非阻塞背压(Backpressure)

2.1 Backpressure(背压)

背压是并就有常用策略,使得发布者拥算不算限制的缓冲区存储元素,用于确保发布者发布元素迅速时,后该去压制订阅者。

2.2 Reactive Streams(响应式流)

一般由以下组成:

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

2.3 响应式编程

有了 Reactive Streams 你这俩 标准和规范,利用规范还都可不都可以进行响应式编程。那再了解下哪几个是 Reactive programming 响应式编程。响应式编程是基于异步和事件驱动的非阻塞应用应用程序,某些某些垂直通过在 JVM 内启动少许应用应用程序扩展,而就有水平通过集群扩展。这某些某些一三个白 编程范例,具体项目中怎么才能 才能 体现呢?

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

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

2.4 Spring Webflux

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

Spring Boot Webflux 有并就有编程模型实现,并就有类事 Spring MVC 注解土土办法,另并就有是使用其功能性端点土土办法。注解的会在第二篇文章讲到,下面快速入门用 Spring Webflux 功能性土土办法实现。

三、Spring Boot 2.0 WebFlux 形状

常用的 Spring Boot 2.0 WebFlux 生产的形状如下:

  • 响应式 API
  • 编程模型
  • 适用性
  • 内嵌容器
  • Starter 组件

还有对日志、Web、消息、测试及扩展等支持。

3.1 响应式 API

Reactor 框架是 Spring Boot Webflux 响应库依赖,通过 Reactive Streams 并与某些响应库交互。提供了 并就有响应式 API : Mono 和 Flux。一般是将 Publisher 作为输入,在框架组织组织结构转上加 Reactor 类型并处里逻辑,怎么才能 会让返回 Flux 或 Mono 作为输出。

3.2 适用性

一图就很明确了,WebFlux 和 MVC 有交集,方便我们歌词 歌词 迁移。怎么才能 会让注意:

  • MVC 能满足场景的,就不还要更改为 WebFlux。
  • 要注意容器的支持,还都可不都可以看看下面内嵌容器的支持。
  • 微服务体系形状,WebFlux 和 MVC 还都可不都可以混合使用。尤其开发 IO 密集型服务的就让,选取 WebFlux 去实现。

3.3 编程模型

Spring 5 web 模块饱含了 Spring WebFlux 的 HTTP 抽象。类事 Servlet API , WebFlux 提供了 WebHandler API 去定义非阻塞 API 抽象接口。还都可不都可以选取以下并就有编程模型实现:

  • 注解控制层。和 MVC 保持一致,WebFlux 也支持响应性 @RequestBody 注解。
  • 功能性端点。基于 lambda 轻量级编程模型,用来路由和处里请求的小工具。和后边最大的区别某些某些,你这俩 模型,全程控制了请求 – 响应的生命流程

3.4 内嵌容器

跟 Spring Boot 大框架一样启动应用,但 WebFlux 默认是通过 Netty 启动,怎么才能 会让自动设置了默认端口为 200200。另外还提供了对 Jetty、Undertow 等容器的支持。开发者自行在上加对应的容器 Starter 组件依赖,即可配置并使用对应内嵌容器实例。

怎么才能 会让要注意,还而是 Servlet 3.1+ 容器,如 Tomcat、Jetty;原应着着非 Servlet 容器,如 Netty 和 Undertow。

3.5 Starter 组件

跟 Spring Boot 大框架一样,Spring Boot Webflux 提供了某些某些 “开箱即用” 的 Starter 组件。Starter 组件是可被加载在应用中的 Maven 依赖项。只还要在 Maven 配置中上加对应的依赖配置,即可使用对应的 Starter 组件。类事,上加 spring-boot-starter-webflux 依赖,就可用于构建响应式 API 服务,其饱含了 Web Flux 和 Tomcat 内嵌容器等。

开发中,某些某些功能是通过上加 Starter 组件的土土办法来进行实现。那末 ,Spring Boot 2.x 常用的 Starter 组件有哪几个呢?

四、Spring Boot 2.0 WebFlux 组件

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

  • Web:Spring WebFlux
  • 模板引擎:Thymeleaf
  • 存储:Redis、MongoDB、Cassandra。不支持 MySQL
  • 内嵌容器:Tomcat、Jetty、Undertow

五、快速入门

5.1 Spring Initializr 快速构建项目骨架

Spring Boot Maven 工程,某些某些普通的 Maven 工程,加入了对应的 Spring Boot 依赖即可。Spring Initializr 则是像代码生成器一样,自动就你可不都可以出来了一三个白 Spring Boot Maven 工程。Spring Initializr 有并就有土土办法还都可不都可以得到 Spring Boot Maven 骨架工程:

5.1.1 start.spring.io 在线生成

Spring 官方提供了名为 Spring Initializr 的网站,去引导你快速生成 Spring Boot 应用。网站地址为:https://start.spring.io,操作步骤如下:

第一步,选取 Maven 原应着着 Gradle 构建工具,开发语言 Java 、Kotlin 原应着着 Groovy,最后选取 Spring Boot 版本号。这里默认选取 Maven 构建工具、Java 开发语言和 Spring Boot 2.0.1。

第二步,输入 Maven 工程信息,即项目组 groupId 和名字 artifactId。这里对应 Maven 信息为:

  • groupId:springboot
  • artifactId:sspringboot-webflux-1-quickstart

    这里默认版本号 version 为 0.0.1-SNAPSHOT 。一三个白 属性在 Maven 依赖仓库是唯一标识的。

第三步,选取工程还要的 Starter 组件和某些依赖。最后点击生成按钮,即可获得骨架工程压缩包。这里快速入门,假如有一天选取 Reactive Web 即可。如图 1-8 所示。

5.2 配置 POM 依赖

检查工程 POM 文件中,算不算配置了 spring-boot-starter-webflux 依赖。原应着着是后边自动生成的,配置如下:

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

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.projectreactor</groupId>
      <artifactId>reactor-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

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 插件,还都可不都可以运行、编译等调用。

5.3 编写处里器类 Handler

新建包 org.spring.springboot.handler ,作为编写功能处里类。新建城市(City)例子的处里类 CityHandler,代码如下:

import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;

@Component
public class CityHandler {

    public Mono<ServerResponse> helloCity(ServerRequest request) {
        return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
                .body(BodyInserters.fromObject("Hello, City!"));
    }
}

ServerResponse 是对响应的封装,还都可不都可以设置响应情況,响应头,响应正文。比如 ok 代表的是 200 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。

这里用 Mono 作为返回对象,原应着着返回饱含了一三个白 ServerResponse 对象,而就有多个元素。

5.4 编写路由器类 Router

新建 org.spring.springboot.router 包,作为编写路由器类。新建城市(City)例子的路由类 CityRouter,代码如下:

import org.spring.springboot.handler.CityHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;

@Configuration
public class CityRouter {


    @Bean
    public RouterFunction<ServerResponse> routeCity(CityHandler cityHandler) {
        return RouterFunctions
                .route(RequestPredicates.GET("/hello")
                                .and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
                        cityHandler::helloCity);
    }

}

RouterFunctions 对请求路由处里类,即将请求路由到处里器。这里将一三个白 GET 请求 /hello 路由到处里器 cityHandler 的 helloCity 土土办法上。跟 Spring MVC 模式下的 HandleMapping 的作用类事。

RouterFunctions.route(RequestPredicate, HandlerFunction) 土土办法,对应的入参是请求参数和处里函数,原应着着请求匹配,就调用对应的处里器函数。

到这里一三个白 简单的服务就写好了,下面怎么才能 会运行该服务。

5.5 启动运行项目

一三个白 简单的 Spring Boot Webflux 工程就开发完毕了,下面运行工程验证下。使用 IDEA 右侧工具栏,点击 Maven Project Tab ,点击使用下 Maven 插件的 install 命令。原应着着使用命令行的形式,在工程根目录下,执行 Maven 清理和安装工程的指令:

cd springboot-webflux-1-quickstart
mvn clean install

在控制台中看了成功的输出:

... 省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:200 min
[INFO] Finished at: 2017-10-15T10:00:54+08:00
[INFO] Final Memory: 31M/174M
[INFO] ------------------------------------------------------------------------

5.5.1 运行工程

在 IDEA 中执行 Application 类启动,任意正常模式原应着着 Debug 模式。还都可不都可以在控制台看了成功运行的输出:

... 省略
2018-04-10 08:43:39.932  INFO 2052 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext     : Started HttpServer on /0:0:0:0:0:0:0:0:200200
2018-04-10 08:43:39.935  INFO 2052 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 200200
2018-04-10 08:43:39.9200  INFO 2052 --- [           main] org.spring.springboot.Application        : Started Application in 6.547 seconds (JVM running for 9.851)

一看,真是 是 Netty 启动的。

打开浏览器,访问 /hello 地址,会看了如图所示的返回结果:

六、总结

本文主要讲了 Spring Boot 2.0 WebFlux 背景和快速入门使用。用的是基于功能性端点去创建一三个白 服务,但你这俩 不怎么才能 会代码偏多。下一章一三个白 CRUD 我们歌词 歌词 使用注解控制层,让开发更方便。

系列教程目录

  • 《01:WebFlux 系列教程大纲》
  • 《02:WebFlux 快速入门实践》
  • 《03:WebFlux Web CRUD 实践》
  • 《04:WebFlux 整合 Mongodb》
  • 《05:WebFlux 整合 Thymeleaf》
  • 《06:WebFlux 中 Thymeleaf 和 Mongodb 实践》
  • 《07:WebFlux 整合 Redis》
  • 《08:WebFlux 中 Redis 实现缓存》
  • 《09:WebFlux 中 WebSocket 实现通信》
  • 《10:WebFlux 集成测试及部署》
  • 《11:WebFlux 实战图书管理系统》

代码示例

本文示例读者还都可不都可以通过查看下面仓库的中的模块工程名: 2-x-spring-boot-webflux-handling-errors:

  • Github:https://github.com/JeffLi1993/springboot-learning-example
  • Gitee:https://gitee.com/jeff1993/springboot-learning-example

原应着着您对哪几个感兴趣,欢迎 star、follow、收藏、转发给予支持!

参考资料

  • Spring Boot 2.x WebFlux 系列:https://www.bysocket.com/archives/2290
  • spring.io 官方文档

以下专题教程你说哪几个您会有兴趣

  • 《Spring Boot 2.x 系列教程》 https://www.bysocket.com/springboot
  • 《Java 核心系列教程》 https://www.bysocket.com/archives/2200

(关注微信公众号,领取 Java 精选干货学习资料) 

(上加我微信:bysocket01。加入纯技术交流群,成长技术)