快速上手WebFlux

一仇让、創(chuàng)建項目

這里我使用IDEA快速創(chuàng)建基于SpringBoot的工程八孝,當然你也可以選spring.io 創(chuàng)建再導入到IDEA 中欲逃。

要創(chuàng)建WebFlux 項目,必須勾選ReactiveWeb而不是傳統(tǒng)的Web 猿诸,這里為了簡化代碼使用到了Lombok婚被。

image-20190601143817483

項目創(chuàng)建完后目錄:

image-20190601145307937

POM 依賴,這里IDEA 自動給項目加上了spring-boot-starter-webflux梳虽。完整依賴如下:

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </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>

二址芯、編寫Controller

序篇 可知道,編寫WebFlux 的Controller 可以沿用SpringMVC 的那一套窜觉,但是返回結果需要改成Mono或者Flux谷炸。

創(chuàng)建一個mono 接口,返回hello webflux竖螃,這里的Mono.just()方法會發(fā)射一個元素淑廊,創(chuàng)建響應式的接口就這么"簡單”。

package com.fine.webfluxquickstart.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

/**
 * @author finefine at: 2019-06-01 15:02
 */
@RestController
@RequestMapping("/api/")
public class HelloController {
    
    @GetMapping("mono")
    public Mono<String> mono() {
        return Mono.just("hello webflux");
    }
}

那么來測試一下特咆,瀏覽器地址輸入 localhost:8080/api/mono季惩。

image-20190601154255193

其實呢,上面mono接口這種執(zhí)行模式是同步非阻塞的腻格,也就是Mono產生數(shù)據(jù)画拾,和Mono與Http 之間的訂閱消費都是在同一個線程。

image.png

那既然這樣菜职,到底是不是在同一個線程中呢青抛,更改代碼證明一下。

package com.fine.webfluxquickstart.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

/**
 * @author finefine at: 2019-06-01 15:02
 */
@RestController
@RequestMapping("/api/")
@Slf4j
public class HelloController {

    @GetMapping("mono")
    public Mono<Object> mono() {
        return Mono.create(monoSink -> {
            log.info("創(chuàng)建 Mono");
            monoSink.success("hello webflux");
        })
        .doOnSubscribe(subscription -> { //當訂閱者去訂閱發(fā)布者的時候酬核,該方法會調用
            log.info("{}",subscription);
        }).doOnNext(o -> { //當訂閱者收到數(shù)據(jù)時蜜另,改方法會調用
            log.info("{}",o);
                });
    }
}

如圖,Mono的創(chuàng)建和消費都是都是在ctor-http-nio-2 這個線程中嫡意,仔細看看這log的順序举瑰,你會發(fā)現(xiàn)訂閱動作在創(chuàng)建動作之前,最后是消費蔬螟,那么為什么會這樣呢此迅?這個先留到后面講,感興趣的可以先去了解一下旧巾。

image-20190601170432212

之前提到了Mono 最多發(fā)射一個數(shù)據(jù)耸序,F(xiàn)lux 可以發(fā)射多個數(shù)據(jù),那么來寫個Flux看看吧鲁猩。

package com.fine.webfluxquickstart.controller;

        import lombok.extern.slf4j.Slf4j;
        import org.springframework.web.bind.annotation.GetMapping;
        import org.springframework.web.bind.annotation.RequestMapping;
        import org.springframework.web.bind.annotation.RestController;
        import reactor.core.publisher.Flux;
        import reactor.core.publisher.Mono;
        import reactor.core.scheduler.Schedulers;

/**
 * @author finefine at: 2019-06-01 15:02
 */
@RestController
@RequestMapping("/api/")
@Slf4j
public class HelloController {

    @GetMapping("mono")
    public Mono<Object> mono() {
        return Mono.create(monoSink -> {
            log.info("創(chuàng)建 Mono");
            monoSink.success("hello webflux");
        })
                .doOnSubscribe(subscription -> {
                    log.info("{}", subscription);
                }).doOnNext(o -> {
                    log.info("{}", o);
                });
    }

    @GetMapping("flux")
    public Flux<String> flux() {
        return Flux.just("hello","webflux","spring","boot");
    }
}

這里Flux發(fā)射了4個數(shù)據(jù)坎怪,來看下結果:

image-20190601172604363

三、總結

WebFlux 應用中廓握,所有數(shù)據(jù)都應該以Mono芋忿、Flux的形式表示炸客,這樣才能帶來最好的性能和高吞吐量。Mono和Flux 這兩種數(shù)據(jù)模型是WebFlux的核心戈钢,本片入門教程只是簡單的展示了WebFlux項目的搭建編寫侵续,要學好WebFlux 還需要掌握Reactor(Mono彪蓬、Flux)烙样,其實Reactor 和 Stream 的很多操作都有類似功能播赁,如果你對Java8Stream非常熟悉的話,學習Reactor應該是也是件容易的事情薪铜,如果還不掌握Stream 建議先去學好Stream众弓。
QQ群:577715614
源碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隔箍,隨后出現(xiàn)的幾起案子谓娃,更是在濱河造成了極大的恐慌,老刑警劉巖蜒滩,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滨达,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯艰,警方通過查閱死者的電腦和手機捡遍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竹握,“玉大人画株,你說我怎么就攤上這事±卜” “怎么了谓传?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芹关。 經(jīng)常有香客問我续挟,道長,這世上最難降的妖魔是什么充边? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任庸推,我火速辦了婚禮常侦,結果婚禮上浇冰,老公的妹妹穿的比我還像新娘。我一直安慰自己聋亡,他們只是感情好肘习,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坡倔,像睡著了一般漂佩。 火紅的嫁衣襯著肌膚如雪脖含。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天投蝉,我揣著相機與錄音养葵,去河邊找鬼。 笑死瘩缆,一個胖子當著我的面吹牛关拒,可吹牛的內容都是我干的。 我是一名探鬼主播庸娱,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼着绊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熟尉?” 一聲冷哼從身側響起归露,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斤儿,沒想到半個月后剧包,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡雇毫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年玄捕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片棚放。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡枚粘,死狀恐怖,靈堂內的尸體忽然破棺而出飘蚯,到底是詐尸還是另有隱情馍迄,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布局骤,位于F島的核電站攀圈,受9級特大地震影響,放射性物質發(fā)生泄漏峦甩。R本人自食惡果不足惜赘来,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凯傲。 院中可真熱鬧犬辰,春花似錦、人聲如沸冰单。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诫欠。三九已至涵卵,卻和暖如春浴栽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轿偎。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工典鸡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坏晦。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓椿每,卻偏偏與公主長得像,于是被迫代替她去往敵國和親英遭。 傳聞我的和親對象是個殘疾皇子间护,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容