【Spring 5】響應(yīng)式Web框架前瞻

引子:被譽(yù)為“中國(guó)大數(shù)據(jù)第一人”的涂子沛先生在其成名作《數(shù)據(jù)之巔》里提到烁竭,摩爾定律召边、社交媒體铺呵、數(shù)據(jù)挖掘是大數(shù)據(jù)的三大成因。IBM的研究稱隧熙,整個(gè)人類文明所獲得的全部數(shù)據(jù)中片挂,有90%是過(guò)去兩年內(nèi)產(chǎn)生的。在此背景下贞盯,包括NoSQL音念,Hadoop, Spark, Storm, Kylin在內(nèi)的大批新技術(shù)應(yīng)運(yùn)而生。其中以RxJavaReactor為代表的響應(yīng)式(Reactive)編程技術(shù)針對(duì)的就是經(jīng)典的大數(shù)據(jù)4V定義(Volume躏敢,Variety闷愤,Velocity,Value)中的Velocity件余,即高并發(fā)問(wèn)題讥脐,而在即將發(fā)布的Spring 5中,也引入了響應(yīng)式編程的支持啼器。在接下來(lái)的幾周旬渠,我會(huì)圍繞響應(yīng)式編程分三期與你分享我的一些學(xué)習(xí)心得。作為第一篇端壳,首先從Spring 5談起告丢。

1 響應(yīng)式宣言

敏捷宣言一樣,說(shuō)起響應(yīng)式編程损谦,必先提到響應(yīng)式宣言岖免。

We want systems that are Responsive, Resilient, Elastic and Message Driven. We call these Reactive Systems. - The Reactive Manifesto

圖片出處:The Reactive Manifesto

不知道是不是為了向敏捷宣言致敬,響應(yīng)式宣言中也包含了4組關(guān)鍵詞:

  • Responsive: 可響應(yīng)的成翩。要求系統(tǒng)盡可能做到在任何時(shí)候都能及時(shí)響應(yīng)觅捆。
  • Resilient: 可恢復(fù)的。要求系統(tǒng)即使出錯(cuò)了麻敌,也能保持可響應(yīng)性栅炒。
  • Elastic: 可伸縮的。要求系統(tǒng)在各種負(fù)載下都能保持可響應(yīng)性。
  • Message Driven: 消息驅(qū)動(dòng)的赢赊。要求系統(tǒng)通過(guò)異步消息連接各個(gè)組件乙漓。

可以看到,對(duì)于任何一個(gè)響應(yīng)式系統(tǒng)释移,首先要保證的就是可響應(yīng)性叭披,否則就稱不上是響應(yīng)式系統(tǒng)。從這個(gè)意義上來(lái)說(shuō)玩讳,動(dòng)不動(dòng)就藍(lán)屏的Windows系統(tǒng)顯然不是一個(gè)響應(yīng)式系統(tǒng)涩蜘。

PS: 如果你贊同響應(yīng)式宣言,不妨到官網(wǎng)上留下的你電子簽名熏纯,我的編號(hào)是18989同诫,試試看能不能找到我。

2 Spring 5前瞻

作為Java世界首個(gè)響應(yīng)式Web框架樟澜,Spring 5最大的亮點(diǎn)莫過(guò)于提供了完整的端到端響應(yīng)式編程的支持误窖。

圖片出處:Spring Framework Reference Documentation

左側(cè)是傳統(tǒng)的基于Servlet的Spring Web MVC框架,右側(cè)是5.0版本新引入的基于Reactive Streams的Spring WebFlux框架秩贰,從上到下依次是Router Functions霹俺,WebFlux,Reactive Streams三個(gè)新組件毒费。

  • Router Functions: 對(duì)標(biāo)@Controller丙唧,@RequestMapping等標(biāo)準(zhǔn)的Spring MVC注解,提供一套函數(shù)式風(fēng)格的API蝗罗,用于創(chuàng)建Router艇棕,Handler和Filter。
  • WebFlux: 核心組件串塑,協(xié)調(diào)上下游各個(gè)組件提供響應(yīng)式編程支持。
  • Reactive Streams: 一種支持背壓(Backpressure)的異步數(shù)據(jù)流處理標(biāo)準(zhǔn)北苟,主流實(shí)現(xiàn)有RxJava和Reactor桩匪,Spring WebFlux默認(rèn)集成的是Reactor。

在Web容器的選擇上友鼻,Spring WebFlux既支持像Tomcat傻昙,Jetty這樣的的傳統(tǒng)容器(前提是支持Servlet 3.1 Non-Blocking IO API),又支持像Netty彩扔,Undertow那樣的異步容器妆档。不管是何種容器,Spring WebFlux都會(huì)將其輸入輸出流適配成Flux<DataBuffer>格式虫碉,以便進(jìn)行統(tǒng)一處理贾惦。

值得一提的是,除了新的Router Functions接口,Spring WebFlux同時(shí)支持使用老的Spring MVC注解聲明Reactive Controller须板。和傳統(tǒng)的MVC Controller不同碰镜,Reactive Controller操作的是非阻塞的ServerHttpRequest和ServerHttpResponse,而不再是Spring MVC里的HttpServletRequest和HttpServletResponse习瑰。

下面是我GitHub上的示例工程里的一個(gè)例子绪颖,

@RestController
public class RestaurantController {

    private final RestaurantRepository restaurantRepository;

    private final ReactiveMongoTemplate reactiveMongoTemplate;

    public RestaurantController(RestaurantRepository restaurantRepository, ReactiveMongoTemplate reactiveMongoTemplate) {
        this.restaurantRepository = restaurantRepository;
        this.reactiveMongoTemplate = reactiveMongoTemplate;
    }

    @GetMapping("/reactive/restaurants")
    public Flux<Restaurant> findAll() {
        return restaurantRepository.findAll();
    }

    @GetMapping("/reactive/restaurants/{id}")
    public Mono<Restaurant> get(@PathVariable String id) {
        return restaurantRepository.findById(id);
    }

    @PostMapping("/reactive/restaurants")
    public Flux<Restaurant> create(@RequestBody Restaurant[] restaurants) {
        return Flux.just(restaurants)
                .log()
                .flatMap(r -> Mono.just(r).subscribeOn(Schedulers.parallel()), 10)
                .flatMap(reactiveMongoTemplate::insert);
    }
}

3 小結(jié)

除了響應(yīng)式編程支持,Spring 5還包括了很多Java程序員期待已久的特性甜奄,包括JDK 9柠横,Junit 5,Servlet 4以及HTTP/2支持课兄。目前Spring 5的最新版本是RC1滓鸠,而Spring Boot也剛剛發(fā)布了2.0.0 M1版本。根據(jù)Spring官方博客第喳,Spring 5將在JDK 9 GA之后隨即發(fā)布糜俗,也就是今年的7月底前后。

以上就是我對(duì)Spring 5中有關(guān)響應(yīng)式編程支持的一些簡(jiǎn)單介紹曲饱,歡迎你到我的留言板分享悠抹,和大家一起過(guò)過(guò)招。下一篇我將聊一下我對(duì)響應(yīng)式編程的一些理解扩淀,敬請(qǐng)期待楔敌。

4 參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驻谆,隨后出現(xiàn)的幾起案子卵凑,更是在濱河造成了極大的恐慌,老刑警劉巖胜臊,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺卢,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡象对,警方通過(guò)查閱死者的電腦和手機(jī)黑忱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勒魔,“玉大人甫煞,你說(shuō)我怎么就攤上這事」诰睿” “怎么了抚吠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)弟胀。 經(jīng)常有香客問(wèn)我楷力,道長(zhǎng)喊式,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任弥雹,我火速辦了婚禮垃帅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘剪勿。我一直安慰自己贸诚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布厕吉。 她就那樣靜靜地躺著酱固,像睡著了一般。 火紅的嫁衣襯著肌膚如雪头朱。 梳的紋絲不亂的頭發(fā)上运悲,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音项钮,去河邊找鬼班眯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛烁巫,可吹牛的內(nèi)容都是我干的署隘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼亚隙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磁餐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起阿弃,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诊霹,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渣淳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脾还,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年水由,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荠呐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡砂客,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呵恢,到底是詐尸還是另有隱情鞠值,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布渗钉,位于F島的核電站彤恶,受9級(jí)特大地震影響钞钙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜声离,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一芒炼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧术徊,春花似錦本刽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至笋除,卻和暖如春斜友,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垃它。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工鲜屏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人国拇。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓洛史,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贝奇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虹菲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容