函數(shù)式web框架 webflux

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?spring boot?webflux

什么是函數(shù)式

函數(shù)式編程是種編程方式,它將電腦運(yùn)算視為函數(shù)的計(jì)算。函數(shù)編程語(yǔ)言最重要的基礎(chǔ)是λ演算(lambda calculus),而且λ演算的函數(shù)可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值)。lambda表達(dá)式對(duì)與大多數(shù)程序員已經(jīng)很熟悉了,jdk8以及es6都是引入lambda。


特性:

?1.惰性計(jì)算?

?2.函數(shù)是“第一等公民”?

?3.只使用表達(dá)式而不使用語(yǔ)句?

?4.沒(méi)有副作用

什么是響應(yīng)式:

Spring官方文檔: In plain terms reactive programming is about non-blocking applications that are asynchronous and event-driven and require a small number of threads to scale vertically (i.e. within the JVM) rather than horizontally (i.e. through clustering).

簡(jiǎn)單來(lái)說(shuō)響應(yīng)式編程是關(guān)于異步的事件驅(qū)動(dòng)的需要少量線程的垂直擴(kuò)展而非水平擴(kuò)展的無(wú)阻塞應(yīng)用

我的理解是以不變應(yīng)萬(wàn)變,呵呵呵,不太好理解。

名詞解釋:?

? ?1.Responsive: 可響應(yīng)的。要求系統(tǒng)盡可能做到在任何時(shí)候都能及時(shí)響應(yīng)。?

? 2.Resilient: 可恢復(fù)的。要求系統(tǒng)即使出錯(cuò)了,也能保持可響應(yīng)性。??

? 3.Elastic: 可伸縮的。要求系統(tǒng)在各種負(fù)載下都能保持可響應(yīng)性。?

? 4.Message Driven:消息驅(qū)動(dòng)的。要求系統(tǒng)通過(guò)異步消息連接各個(gè)組件。

什么是webFlux:


左側(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格式,以便進(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。

@GetMapping("/reactive/XX")

?public Flux<T>? ?findAll() {

?return Repository.findAll();?

?}

可以看到主要變化就是在 返回的類型上Flux

Flux和Mono 是?Reactor?中的流數(shù)據(jù)類型,其中Flux會(huì)發(fā)送多次,Mono會(huì)發(fā)送0次或一次

? ? ? ???:使用webflux需要具備的基礎(chǔ)是Reactive programming 的理解。Reactor 的基礎(chǔ) 和 熟練的java8 lambda使用

Talk is cheap, show me the code。

先展示代碼:

好了,這是我17年的代碼,git地址:spring boot webflux deno

無(wú)法跳轉(zhuǎn):https://code.aliyun.com/kayson_yang/spring5-demo

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

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

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