福利
現(xiàn)在關(guān)注微信公眾號(hào):碼農(nóng)小胖哥腋粥, 發(fā)送關(guān)鍵字【抽獎(jiǎng)】進(jìn)行抽獎(jiǎng)晦雨,可有機(jī)會(huì)獲取實(shí)體編程書籍“澹【本次抽獎(jiǎng)截止到周末闹瞧,如果錯(cuò)過以后還有很多機(jī)會(huì)】
前言
Reactor 3是一個(gè)圍繞Reactive Streams規(guī)范構(gòu)建的庫,它在JVM上引入了響應(yīng)式編程的一個(gè)范例展辞。目前Spring5 引入的Webflux就是reactor 3實(shí)現(xiàn)的一個(gè)響應(yīng)式web框架奥邮。Spring Cloud Gateway是Webflux的一個(gè)網(wǎng)關(guān)場景實(shí)踐。想學(xué)好上面這兩項(xiàng)技術(shù)必須搞明白響應(yīng)式編程以及Reactor 3。本篇文章中洽腺,小胖哥將帶你來簡單了解響應(yīng)式編程和Reactor 3脚粟。
為什么要搞響應(yīng)式
有這么一個(gè)場景,產(chǎn)品提了一個(gè)這么需求:商品打折蘸朋,根據(jù)商品的原價(jià)來計(jì)算商品的折扣價(jià)核无。這個(gè)需求不是很簡單嘛,按照我們通常的做法藕坯,搞一個(gè)如下的方法就搞定了团南。
但是如果我折扣改了呢,這時(shí)有人該說重新計(jì)算啊炼彪。這樣是不是重新走了一次流程呢吐根,我們需要花精力來維護(hù)這種流程邏輯。那么能不能我下游能直接響應(yīng)上游的變化辐马?就像excel表格計(jì)算一樣拷橘,下游始終監(jiān)聽上游,有點(diǎn)風(fēng)吹草動(dòng)齐疙,結(jié)果就會(huì)變化膜楷。這種潛在的需求就是響應(yīng)式。響應(yīng)式編程正是用某種操作符幫助你構(gòu)建這種關(guān)系贞奋,而不是執(zhí)行某種賦值命令赌厅。這種思想其實(shí)在前端的一些框架中已經(jīng)風(fēng)靡很久了。
響應(yīng)式的特點(diǎn)
基于以上的一個(gè)簡單事例轿塔。我們可以看出如果是響應(yīng)式一定要有一個(gè)觸發(fā)點(diǎn)特愿。就像我們點(diǎn)擊了計(jì)算機(jī)桌面的QQ圖標(biāo)一只企鵝跳啊跳。我們點(diǎn)擊了迅雷圖標(biāo)有一只飛鳥在撲騰著翅膀勾缭。計(jì)算機(jī)只維護(hù)一個(gè)點(diǎn)擊圖標(biāo)的事件揍障。也就是說響應(yīng)式編程一定是一個(gè)事件觸發(fā)機(jī)制。并且是以異步和非阻塞的方式發(fā)送和接收的俩由。不是我們平常請(qǐng)求-響應(yīng)的同步模型毒嫡。事件驅(qū)動(dòng)的系統(tǒng)通過push而不是pull來處理,生產(chǎn)者在有消息時(shí)才推送消息給消費(fèi)者幻梯,而不是通過一種浪費(fèi)資源方式:讓 消費(fèi)者不斷地輪詢或等待數(shù)據(jù)兜畸。基于這個(gè)機(jī)制相對(duì)高的吞吐量和實(shí)時(shí)響應(yīng)也是響應(yīng)式的特點(diǎn)碘梢。事件驅(qū)動(dòng)由于Publisher只用關(guān)心數(shù)據(jù)源咬摇,Consumer只用關(guān)心
對(duì)處理結(jié)果的消費(fèi)。完全是松耦合的煞躬。這就給我們很大的操作空間來定制化我們的邏輯組合肛鹏,從而使異步代碼更一睹和可維護(hù)逸邦。
Reactor簡介
Reactor 3框架是Pivotal(Spring 母公司)基于Reactive Programming思想實(shí)現(xiàn)的。它實(shí)現(xiàn)了Reactive Streams(該規(guī)范由 Netflix在扰、TypeSafe缕减、Pivotal等公司發(fā)起的響應(yīng)式規(guī)范)。其他諸如RxJava 2, Akka Streams, Vert.x和Ratpack也都實(shí)現(xiàn)了該規(guī)范健田。
Reactor有一個(gè)很重要概念的就是backpressure烛卧。 由于生產(chǎn)者消費(fèi)者處理數(shù)據(jù)的能力不對(duì)等佛纫,很容易產(chǎn)生下游消費(fèi)能力過載的問題妓局。這就需要一個(gè)backpressure處理,來告訴上游生產(chǎn)者避免過載呈宇。打個(gè)比方好爬,一個(gè)人負(fù)責(zé)放水,一個(gè)人負(fù)責(zé)接水甥啄,如果放水的速度太快存炮,水桶勢必會(huì)濺出來,接水的人會(huì)根據(jù)情況來告訴放水的人什么速度最合適蜈漓,并且在快滿的時(shí)候告知放水人關(guān)閉開關(guān)穆桂。
Reactor還添加了運(yùn)算符的概念,這些運(yùn)算符被鏈接在一起以描述在每個(gè)階段對(duì)數(shù)據(jù)應(yīng)用的處理融虽。應(yīng)用運(yùn)算符返回一個(gè)中間Publisher(實(shí)際上享完,它可以被認(rèn)為是上游運(yùn)算符的訂閱者和下游的發(fā)布者)。數(shù)據(jù)的最終歸納點(diǎn)是在最終Subscriber中(這里還定義了用戶角度的業(yè)務(wù)邏輯)有额。還拿放水舉例般又,如果我們放水不是為了單純放水而是造肥宅快樂水。這樣就不是一個(gè)人接水了巍佑,中間加入了原漿茴迁,下一個(gè)接的人接到了原漿勾兌水,那么這個(gè)人充當(dāng)了最開始的消費(fèi)者萤衰,但是注意他不是最終的消費(fèi)者堕义。他的下游還有加氣兒的。他下游的下游還有罐裝操作脆栋。到這里整個(gè)工藝才算告一段落倦卖。這里你也更能看清backpressure(背壓)操作的作用,可能開始是大桶筹吐,到罐裝流程開始小瓶子了糖耸。通過背壓來控制出水的速率。
最上面揭示了一個(gè)最小單元的Reactor流程丘薛,源Publisher產(chǎn)生數(shù)據(jù)嘉竟。但默認(rèn)情況下,它只有Subscriber在注冊(訂閱)之后才會(huì)把數(shù)據(jù)推送給Subscriber執(zhí)行運(yùn)算符操作,中間可能伴隨者背壓處理舍扰。其實(shí)這些概念更重要的是理解它們倦蚪。理解了Reactor的特性才能為后面更好的學(xué)習(xí)java響應(yīng)式編程打好基礎(chǔ)。
關(guān)注公眾號(hào):碼農(nóng)小胖哥边苹,獲取更多資訊