? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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