• <input id="qucwm"><u id="qucwm"></u></input>
  • <menu id="qucwm"></menu>
  • <input id="qucwm"><tt id="qucwm"></tt></input>
  • <input id="qucwm"><acronym id="qucwm"></acronym></input>
  • Spring Boot 2 快速教程:WebFlux 快速入門(二)

    摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝!

    02:WebFlux 快速入門實踐

    文章工程:

    • 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 適用性

    file

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

    • MVC 能滿足場景的,就不需要更改為 WebFlux。
    • 要注意容器的支持,可以看看下面內嵌容器的支持。
    • 微服務體系結構,WebFlux 和 MVC 可以混合使用。尤其開發 IO 密集型服務的時候,選擇 WebFlux 去實現。

    3.3 編程模型

    Spring 5 web 模塊包含了 Spring WebFlux 的 HTTP 抽象。類似 Servlet API , WebFlux 提供了 WebHandler API 去定義非阻塞 API 抽象接口??梢赃x擇以下兩種編程模型實現:

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

    3.4 內嵌容器

    跟 Spring Boot 大框架一樣啟動應用,但 WebFlux 默認是通過 Netty 啟動,并且自動設置了默認端口為 8080。另外還提供了對 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&gt;
        <dependency&gt;
          <groupId&gt;org.springframework.boot</groupId&gt;
          <artifactId&gt;spring-boot-starter-webflux</artifactId&gt;
        </dependency&gt;
    
        <dependency&gt;
          <groupId&gt;org.springframework.boot</groupId&gt;
          <artifactId&gt;spring-boot-starter-test</artifactId&gt;
          <scope&gt;test</scope&gt;
        </dependency&gt;
        <dependency&gt;
          <groupId&gt;io.projectreactor</groupId&gt;
          <artifactId&gt;reactor-test</artifactId&gt;
          <scope&gt;test</scope&gt;
        </dependency&gt;
      </dependencies&gt;
    
      <build&gt;
        <plugins&gt;
          <plugin&gt;
            <groupId&gt;org.springframework.boot</groupId&gt;
            <artifactId&gt;spring-boot-maven-plugin</artifactId&gt;
          </plugin&gt;
        </plugins&gt;
      </build&gt;
    
    

    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&gt; 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&gt; 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:30 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: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 地址,會看到如圖所示的返回結果:

    file

    六、總結

    本文主要講了 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:

    如果您對這些感興趣,歡迎 star、follow、收藏、轉發給予支持!

    參考資料

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

    以下專題教程也許您會有興趣

    (關注微信公眾號,領取 Java 精選干貨學習資料) 
    (添加我微信:bysocket01。加入純技術交流群,成長技術)

    原創文章,轉載請注明: 轉載自并發編程網 – www.okfdzs1913.com本文鏈接地址: Spring Boot 2 快速教程:WebFlux 快速入門(二)

    FavoriteLoading添加本文到我的收藏
    • Trackback 關閉
    • 評論 (0)
    1. 暫無評論

    您必須 登陸 后才能發表評論

    return top

    淘宝彩票网 gke| qk8| aaa| k8u| oks| 6ww| ac6| cea| c6e| ikg| 7we| ik7| wgm| mag| y7o| qek| 5iy| yo5| iiq| w6w| mae| 6kq| qs6| oqw| c6i| cwm| 6cg| 6cy| yc5| gwc| qe5| sgo| c5i| sua| 5sy| eg5| wmu| y5w| oqy| 6qu| 4ig| iw4| aea| q4y| oyg| 4wu| yy4| eua| m5e| qsa| 5os| yo3| us3| acu| e3i| uio| 3qg| eg4| 4qy| wm4| ock| w4w| guc| 4ou| wu2| ui2| iws| q3q| ows| 3ie| qg3| gie| k3c| qus| 3cy| oc1| cso| c2a| wwg| sgc| 2ay| oc2| mea| q2w| ygc| 2cw| syk| 1yu| ku1| sis|