Spring Boot 2.0 WebFlux 上手系列課程:快速入門(一)

02:WebFlux 快速入門實踐

Spring Boot 2.0

spring.io 官網(wǎng)有句醒目的話是:

BUILD ANYTHING WITH SPRING BOOT

Spring Boot (Boot 顧名思義,是引導(dǎo)的意思)框架是用于簡化 Spring 應(yīng)用從搭建到開發(fā)的過程。應(yīng)用開箱即用,只要通過一個指令,包括命令行 java -jar 、SpringApplication 應(yīng)用啟動類 、 Spring Boot Maven 插件等,就可以啟動應(yīng)用了。另外,Spring Boot 強(qiáng)調(diào)只需要很少的配置文件,所以在開發(fā)生產(chǎn)級 Spring 應(yīng)用中,讓開發(fā)變得更加高效和簡易。目前,Spring Boot 版本是 2.x 版本。Spring Boot 包括 WebFlux。

image

Spring Boot 2.0 WebFlux

了解 WebFlux ,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的庫標(biāo)準(zhǔn)和規(guī)范:

  • 處理可能無限數(shù)量的元素
  • 按順序處理
  • 組件之間異步傳遞
  • 強(qiáng)制性非阻塞背壓(Backpressure)

Backpressure(背壓)

背壓是一種常用策略,使得發(fā)布者擁有無限制的緩沖區(qū)存儲元素,用于確保發(fā)布者發(fā)布元素太快時,不會去壓制訂閱者。

Reactive Streams(響應(yīng)式流)

一般由以下組成:

  • 發(fā)布者:發(fā)布元素到訂閱者
  • 訂閱者:消費(fèi)元素
  • 訂閱:在發(fā)布者中,訂閱被創(chuàng)建時,將與訂閱者共享
  • 處理器:發(fā)布者與訂閱者之間處理數(shù)據(jù)

響應(yīng)式編程
有了 Reactive Streams 這種標(biāo)準(zhǔn)和規(guī)范,利用規(guī)范可以進(jìn)行響應(yīng)式編程。那再了解下什么是 Reactive programming 響應(yīng)式編程。響應(yīng)式編程是基于異步和事件驅(qū)動的非阻塞程序,只是垂直通過在 JVM 內(nèi)啟動少量線程擴(kuò)展,而不是水平通過集群擴(kuò)展。這就是一個編程范例,具體項目中如何體現(xiàn)呢?

響應(yīng)式項目編程實戰(zhàn)中,通過基于 Reactive Streams 規(guī)范實現(xiàn)的框架 Reactor 去實戰(zhàn)。Reactor 一般提供兩種響應(yīng)式 API :

  • Mono:實現(xiàn)發(fā)布者,并返回 0 或 1 個元素
  • Flux:實現(xiàn)發(fā)布者,并返回 N 個元素

Spring Webflux

Spring Boot Webflux 就是基于 Reactor 實現(xiàn)的。Spring Boot 2.0 包括一個新的 spring-webflux 模塊。該模塊包含對響應(yīng)式 HTTP 和 WebSocket 客戶端的支持,以及對 REST,HTML 和 WebSocket 交互等程序的支持。一般來說,Spring MVC 用于同步處理,Spring Webflux 用于異步處理。

Spring Boot Webflux 有兩種編程模型實現(xiàn),一種類似 Spring MVC 注解方式,另一種是使用其功能性端點方式。注解的會在第二篇文章講到,下面快速入門用 Spring Webflux 功能性方式實現(xiàn)。

Spring Boot 2.0 WebFlux 特性

常用的 Spring Boot 2.0 WebFlux 生產(chǎn)的特性如下:

  • 響應(yīng)式 API
  • 編程模型
  • 適用性
  • 內(nèi)嵌容器
  • Starter 組件

還有對日志、Web、消息、測試及擴(kuò)展等支持。

響應(yīng)式 API

Reactor 框架是 Spring Boot Webflux 響應(yīng)庫依賴,通過 Reactive Streams 并與其他響應(yīng)庫交互。提供了 兩種響應(yīng)式 API : Mono 和 Flux。一般是將 Publisher 作為輸入,在框架內(nèi)部轉(zhuǎn)換成 Reactor 類型并處理邏輯,然后返回 Flux 或 Mono 作為輸出。

適用性

[圖片上傳失敗...(image-3cb7cf-1523693503530)]

一圖就很明確了,WebFlux 和 MVC 有交集,方便大家遷移。但是注意:

  • MVC 能滿足場景的,就不需要更改為 WebFlux。
  • 要注意容器的支持,可以看看下面內(nèi)嵌容器的支持。
  • 微服務(wù)體系結(jié)構(gòu),WebFlux 和 MVC 可以混合使用。尤其開發(fā) IO 密集型服務(wù)的時候,選擇 WebFlux 去實現(xiàn)。

編程模型

Spring 5 web 模塊包含了 Spring WebFlux 的 HTTP 抽象。類似 Servlet API , WebFlux 提供了 WebHandler API 去定義非阻塞 API 抽象接口。可以選擇以下兩種編程模型實現(xiàn):

  • 注解控制層。和 MVC 保持一致,WebFlux 也支持響應(yīng)性 @RequestBody 注解。
  • 功能性端點?;?lambda 輕量級編程模型,用來路由和處理請求的小工具。和上面最大的區(qū)別就是,這種模型,全程控制了請求 - 響應(yīng)的生命流程

內(nèi)嵌容器

跟 Spring Boot 大框架一樣啟動應(yīng)用,但 WebFlux 默認(rèn)是通過 Netty 啟動,并且自動設(shè)置了默認(rèn)端口為 8080。另外還提供了對 Jetty、Undertow 等容器的支持。開發(fā)者自行在添加對應(yīng)的容器 Starter 組件依賴,即可配置并使用對應(yīng)內(nèi)嵌容器實例。

但是要注意,必須是 Servlet 3.1+ 容器,如 Tomcat、Jetty;或者非 Servlet 容器,如 Netty 和 Undertow。

Starter 組件

跟 Spring Boot 大框架一樣,Spring Boot Webflux 提供了很多 “開箱即用” 的 Starter 組件。Starter 組件是可被加載在應(yīng)用中的 Maven 依賴項。只需要在 Maven 配置中添加對應(yīng)的依賴配置,即可使用對應(yīng)的 Starter 組件。例如,添加 spring-boot-starter-webflux 依賴,就可用于構(gòu)建響應(yīng)式 API 服務(wù),其包含了 Web Flux 和 Tomcat 內(nèi)嵌容器等。

開發(fā)中,很多功能是通過添加 Starter 組件的方式來進(jìn)行實現(xiàn)。那么,Spring Boot 2.x 常用的 Starter 組件有哪些呢?

Spring Boot 2.0 WebFlux 組件

Spring Boot WebFlux 官方提供了很多 Starter 組件,每個模塊會有多種技術(shù)實現(xiàn)選型支持,來實現(xiàn)各種復(fù)雜的業(yè)務(wù)需求:

  • Web:Spring WebFlux
  • 模板引擎:Thymeleaf
  • 存儲:Redis、MongoDB、Cassandra。不支持 MySQL
  • 內(nèi)嵌容器:Tomcat、Jetty、Undertow

快速入門

Spring Initializr 快速構(gòu)建項目骨架

Spring Boot Maven 工程,就是普通的 Maven 工程,加入了對應(yīng)的 Spring Boot 依賴即可。Spring Initializr 則是像代碼生成器一樣,自動就給你出來了一個 Spring Boot Maven 工程。Spring Initializr 有兩種方式可以得到 Spring Boot Maven 骨架工程:

start.spring.io 在線生成

Spring 官方提供了名為 Spring Initializr 的網(wǎng)站,去引導(dǎo)你快速生成 Spring Boot 應(yīng)用。網(wǎng)站地址為:https://start.spring.io,操作步驟如下:

第一步,選擇 Maven 或者 Gradle 構(gòu)建工具,開發(fā)語言 Java 、Kotlin 或者 Groovy,最后確定 Spring Boot 版本號。這里默認(rèn)選擇 Maven 構(gòu)建工具、Java 開發(fā)語言和 Spring Boot 2.0.1。

第二步,輸入 Maven 工程信息,即項目組 groupId 和名字 artifactId。這里對應(yīng) Maven 信息為:

  • groupId:springboot
  • artifactId:sspringboot-webflux-1-quickstart
    這里默認(rèn)版本號 version 為 0.0.1-SNAPSHOT 。三個屬性在 Maven 依賴倉庫是唯一標(biāo)識的。

第三步,選擇工程需要的 Starter 組件和其他依賴。最后點擊生成按鈕,即可獲得骨架工程壓縮包。這里快速入門,只要選擇 Reactive Web 即可。如圖 1-8 所示。

[圖片上傳失敗...(image-786839-1523693503530)]

配置 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 依賴,是我們核心需要學(xué)習(xí) webflux 的包,里面默認(rèn)包含了 spring-boot-starter-reactor-netty 、spring 5 webflux 包。也就是說默認(rèn)是通過 netty 啟動的。

reactor-test、spring-boot-starter-test 兩個依賴搭配是用于單元測試。

spring-boot-maven-plugin 是 Spring Boot Maven 插件,可以運(yùn)行、編譯等調(diào)用。

編寫處理器類 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 是對響應(yīng)的封裝,可以設(shè)置響應(yīng)狀態(tài),響應(yīng)頭,響應(yīng)正文。比如 ok 代表的是 200 響應(yīng)碼、MediaType 枚舉是代表這文本內(nèi)容類型、返回的是 String 的對象。

這里用 Mono 作為返回對象,是因為返回包含了一個 ServerResponse 對象,而不是多個元素。

編寫路由器類 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) 方法,對應(yīng)的入?yún)⑹钦埱髤?shù)和處理函數(shù),如果請求匹配,就調(diào)用對應(yīng)的處理器函數(shù)。

到這里一個簡單的服務(wù)就寫好了,下面怎么運(yùn)行該服務(wù)。

啟動運(yùn)行項目

一個簡單的 Spring Boot Webflux 工程就開發(fā)完畢了,下面運(yùn)行工程驗證下。使用 IDEA 右側(cè)工具欄,點擊 Maven Project Tab ,點擊使用下 Maven 插件的 install 命令。或者使用命令行的形式,在工程根目錄下,執(zhí)行 Maven 清理和安裝工程的指令:

cd springboot-webflux-1-quickstart
mvn clean install

在控制臺中看到成功的輸出:

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

運(yùn)行工程

在 IDEA 中執(zhí)行 Application 類啟動,任意正常模式或者 Debug 模式??梢栽诳刂婆_看到成功運(yùn)行的輸出:

... 省略
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:8080
2018-04-10 08:43:39.935  INFO 2052 --- [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port(s): 8080
2018-04-10 08:43:39.960  INFO 2052 --- [           main] org.spring.springboot.Application        : Started Application in 6.547 seconds (JVM running for 9.851)

一看,確實是 Netty 啟動的。

打開瀏覽器,訪問 /hello 地址,會看到如圖所示的返回結(jié)果:

[圖片上傳失敗...(image-80ce85-1523693503530)]

最后

開發(fā)運(yùn)行環(huán)境:

  • JDK 1.8+ Spring Boot 2.x 要求 JDK 1.8 環(huán)境及以上版本。另外,Spring Boot 2.x 只兼容 Spring Framework 5.0 及以上版本。

  • Maven 3.2+ 為 Spring Boot 2.x 提供了相關(guān)依賴構(gòu)建工具是 Maven,版本需要 3.2 及以上版本。使用 Gradle 則需要 1.12 及以上版本。Maven 和 Gradle 大家各自挑選下喜歡的就好。

  • IntelliJ IDEA IntelliJ IDEA (簡稱 IDEA)是常用的開發(fā)工具,也是本書推薦使用的。同樣使用 Eclipse IDE 自然也是可以的。

開發(fā)使用框架:

  • Mongodb
  • Redis
  • Thymeleaf
  • WebSocket

課程目錄

  • 《01:課程概要》
  • 《02:WebFlux 快速入門實踐》
  • 《03:WebFlux Web CRUD 實踐》
  • 《04:WebFlux 整合 Mongodb》
  • 《05:WebFlux 整合 Thymeleaf》
  • 《06:WebFlux 中 Thymeleaf 和 Mongodb 實踐》
  • 《07:WebFlux 整合 Redis》
  • 《08:WebFlux 中 Redis 實現(xiàn)緩存》
  • 《09:WebFlux 中 WebSocket 實現(xiàn)通信》
  • 《10:WebFlux 集成測試及部署》
  • 《11:WebFlux 實戰(zhàn)圖書管理系統(tǒng)》

系列課程:傳送門
系列課程:傳送門
系列課程:傳送門

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容