摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過(guò)在內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對(duì)日志消息測(cè)試及擴(kuò)展等支持。
摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝!
02:WebFlux 快速入門(mén)實(shí)踐文章工程:
JDK 1.8
Maven 3.5.2
Spring Boot 2.1.3.RELEASE
工程名:springboot-webflux-1-quickstart
工程地址:見(jiàn)文末
一、Spring Boot 2.0spring.io 官網(wǎng)有句醒目的話是:
BUILD ANYTHING WITH SPRING BOOT
Spring Boot (Boot 顧名思義,是引導(dǎo)的意思)框架是用于簡(jiǎn)化 Spring 應(yīng)用從搭建到開(kāi)發(fā)的過(guò)程。應(yīng)用開(kāi)箱即用,只要通過(guò)一個(gè)指令,包括命令行 java -jar 、SpringApplication 應(yīng)用啟動(dòng)類(lèi) 、 Spring Boot Maven 插件等,就可以啟動(dòng)應(yīng)用了。另外,Spring Boot 強(qiáng)調(diào)只需要很少的配置文件,所以在開(kāi)發(fā)生產(chǎn)級(jí) Spring 應(yīng)用中,讓開(kāi)發(fā)變得更加高效和簡(jiǎn)易。目前,Spring Boot 版本是 2.x 版本。Spring Boot 包括 WebFlux。
二、Spring Boot 2.0 WebFlux了解 WebFlux ,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的庫(kù)標(biāo)準(zhǔn)和規(guī)范:
處理可能無(wú)限數(shù)量的元素
按順序處理
組件之間異步傳遞
強(qiáng)制性非阻塞背壓(Backpressure)
2.1 Backpressure(背壓)
背壓是一種常用策略,使得發(fā)布者擁有無(wú)限制的緩沖區(qū)存儲(chǔ)元素,用于確保發(fā)布者發(fā)布元素太快時(shí),不會(huì)去壓制訂閱者。
2.2 Reactive Streams(響應(yīng)式流)
一般由以下組成:
發(fā)布者:發(fā)布元素到訂閱者
訂閱者:消費(fèi)元素
訂閱:在發(fā)布者中,訂閱被創(chuàng)建時(shí),將與訂閱者共享
處理器:發(fā)布者與訂閱者之間處理數(shù)據(jù)
2.3 響應(yīng)式編程
有了 Reactive Streams 這種標(biāo)準(zhǔn)和規(guī)范,利用規(guī)范可以進(jìn)行響應(yīng)式編程。那再了解下什么是 Reactive programming 響應(yīng)式編程。響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過(guò)在 JVM 內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。這就是一個(gè)編程范例,具體項(xiàng)目中如何體現(xiàn)呢?
響應(yīng)式項(xiàng)目編程實(shí)戰(zhàn)中,通過(guò)基于 Reactive Streams 規(guī)范實(shí)現(xiàn)的框架 Reactor 去實(shí)戰(zhàn)。Reactor 一般提供兩種響應(yīng)式 API :
Mono:實(shí)現(xiàn)發(fā)布者,并返回 0 或 1 個(gè)元素
Flux:實(shí)現(xiàn)發(fā)布者,并返回 N 個(gè)元素
2.4 Spring Webflux
Spring Boot Webflux 就是基于 Reactor 實(shí)現(xiàn)的。Spring Boot 2.0 包括一個(gè)新的 spring-webflux 模塊。該模塊包含對(duì)響應(yīng)式 HTTP 和 WebSocket 客戶端的支持,以及對(duì) REST,HTML 和 WebSocket 交互等程序的支持。一般來(lái)說(shuō),Spring MVC 用于同步處理,Spring Webflux 用于異步處理。
Spring Boot Webflux 有兩種編程模型實(shí)現(xiàn),一種類(lèi)似 Spring MVC 注解方式,另一種是使用其功能性端點(diǎn)方式。注解的會(huì)在第二篇文章講到,下面快速入門(mén)用 Spring Webflux 功能性方式實(shí)現(xiàn)。
三、Spring Boot 2.0 WebFlux 特性常用的 Spring Boot 2.0 WebFlux 生產(chǎn)的特性如下:
響應(yīng)式 API
編程模型
適用性
內(nèi)嵌容器
Starter 組件
還有對(duì)日志、Web、消息、測(cè)試及擴(kuò)展等支持。
3.1 響應(yīng)式 APIReactor 框架是 Spring Boot Webflux 響應(yīng)庫(kù)依賴,通過(guò) Reactive Streams 并與其他響應(yīng)庫(kù)交互。提供了 兩種響應(yīng)式 API : Mono 和 Flux。一般是將 Publisher 作為輸入,在框架內(nèi)部轉(zhuǎn)換成 Reactor 類(lèi)型并處理邏輯,然后返回 Flux 或 Mono 作為輸出。
3.2 適用性一圖就很明確了,WebFlux 和 MVC 有交集,方便大家遷移。但是注意:
MVC 能滿足場(chǎng)景的,就不需要更改為 WebFlux。
要注意容器的支持,可以看看下面內(nèi)嵌容器的支持。
微服務(wù)體系結(jié)構(gòu),WebFlux 和 MVC 可以混合使用。尤其開(kāi)發(fā) IO 密集型服務(wù)的時(shí)候,選擇 WebFlux 去實(shí)現(xiàn)。
3.3 編程模型Spring 5 web 模塊包含了 Spring WebFlux 的 HTTP 抽象。類(lèi)似 Servlet API , WebFlux 提供了 WebHandler API 去定義非阻塞 API 抽象接口。可以選擇以下兩種編程模型實(shí)現(xiàn):
注解控制層。和 MVC 保持一致,WebFlux 也支持響應(yīng)性 @RequestBody 注解。
功能性端點(diǎn)。基于 lambda 輕量級(jí)編程模型,用來(lái)路由和處理請(qǐng)求的小工具。和上面最大的區(qū)別就是,這種模型,全程控制了請(qǐng)求 - 響應(yīng)的生命流程
3.4 內(nèi)嵌容器跟 Spring Boot 大框架一樣啟動(dòng)應(yīng)用,但 WebFlux 默認(rèn)是通過(guò) Netty 啟動(dòng),并且自動(dòng)設(shè)置了默認(rèn)端口為 8080。另外還提供了對(duì) Jetty、Undertow 等容器的支持。開(kāi)發(fā)者自行在添加對(duì)應(yīng)的容器 Starter 組件依賴,即可配置并使用對(duì)應(yīng)內(nèi)嵌容器實(shí)例。
但是要注意,必須是 Servlet 3.1+ 容器,如 Tomcat、Jetty;或者非 Servlet 容器,如 Netty 和 Undertow。
3.5 Starter 組件跟 Spring Boot 大框架一樣,Spring Boot Webflux 提供了很多 “開(kāi)箱即用” 的 Starter 組件。Starter 組件是可被加載在應(yīng)用中的 Maven 依賴項(xiàng)。只需要在 Maven 配置中添加對(duì)應(yīng)的依賴配置,即可使用對(duì)應(yīng)的 Starter 組件。例如,添加 spring-boot-starter-webflux 依賴,就可用于構(gòu)建響應(yīng)式 API 服務(wù),其包含了 Web Flux 和 Tomcat 內(nèi)嵌容器等。
開(kāi)發(fā)中,很多功能是通過(guò)添加 Starter 組件的方式來(lái)進(jìn)行實(shí)現(xiàn)。那么,Spring Boot 2.x 常用的 Starter 組件有哪些呢?
四、Spring Boot 2.0 WebFlux 組件Spring Boot WebFlux 官方提供了很多 Starter 組件,每個(gè)模塊會(huì)有多種技術(shù)實(shí)現(xiàn)選型支持,來(lái)實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)需求:
Web:Spring WebFlux
模板引擎:Thymeleaf
存儲(chǔ):Redis、MongoDB、Cassandra。不支持 MySQL
內(nèi)嵌容器:Tomcat、Jetty、Undertow
五、快速入門(mén) 5.1 Spring Initializr 快速構(gòu)建項(xiàng)目骨架Spring Boot Maven 工程,就是普通的 Maven 工程,加入了對(duì)應(yīng)的 Spring Boot 依賴即可。Spring Initializr 則是像代碼生成器一樣,自動(dòng)就給你出來(lái)了一個(gè) Spring Boot Maven 工程。Spring Initializr 有兩種方式可以得到 Spring Boot Maven 骨架工程:
5.1.1 start.spring.io 在線生成Spring 官方提供了名為 Spring Initializr 的網(wǎng)站,去引導(dǎo)你快速生成 Spring Boot 應(yīng)用。網(wǎng)站地址為:https://start.spring.io,操作步驟如下:
第一步,選擇 Maven 或者 Gradle 構(gòu)建工具,開(kāi)發(fā)語(yǔ)言 Java 、Kotlin 或者 Groovy,最后確定 Spring Boot 版本號(hào)。這里默認(rèn)選擇 Maven 構(gòu)建工具、Java 開(kāi)發(fā)語(yǔ)言和 Spring Boot 2.0.1。
第二步,輸入 Maven 工程信息,即項(xiàng)目組 groupId 和名字 artifactId。這里對(duì)應(yīng) Maven 信息為:
groupId:springboot
artifactId:sspringboot-webflux-1-quickstart
這里默認(rèn)版本號(hào) version 為 0.0.1-SNAPSHOT 。三個(gè)屬性在 Maven 依賴倉(cāng)庫(kù)是唯一標(biāo)識(shí)的。
第三步,選擇工程需要的 Starter 組件和其他依賴。最后點(diǎn)擊生成按鈕,即可獲得骨架工程壓縮包。這里快速入門(mén),只要選擇 Reactive Web 即可。如圖 1-8 所示。
5.2 配置 POM 依賴檢查工程 POM 文件中,是否配置了 spring-boot-starter-webflux 依賴。如果是上面自動(dòng)生成的,配置如下:
org.springframework.boot spring-boot-starter-webflux org.springframework.boot spring-boot-starter-test test io.projectreactor reactor-test test org.springframework.boot spring-boot-maven-plugin
spring-boot-starter-webflux 依賴,是我們核心需要學(xué)習(xí) webflux 的包,里面默認(rèn)包含了 spring-boot-starter-reactor-netty 、spring 5 webflux 包。也就是說(shuō)默認(rèn)是通過(guò) netty 啟動(dòng)的。
reactor-test、spring-boot-starter-test 兩個(gè)依賴搭配是用于單元測(cè)試。
spring-boot-maven-plugin 是 Spring Boot Maven 插件,可以運(yùn)行、編譯等調(diào)用。
5.3 編寫(xiě)處理器類(lèi) Handler新建包 org.spring.springboot.handler ,作為編寫(xiě)功能處理類(lèi)。新建城市(City)例子的處理類(lèi) CityHandler,代碼如下:
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Mono;
@Component
public class CityHandler {
public Mono helloCity(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello, City!"));
}
}
ServerResponse 是對(duì)響應(yīng)的封裝,可以設(shè)置響應(yīng)狀態(tài),響應(yīng)頭,響應(yīng)正文。比如 ok 代表的是 200 響應(yīng)碼、MediaType 枚舉是代表這文本內(nèi)容類(lèi)型、返回的是 String 的對(duì)象。
這里用 Mono 作為返回對(duì)象,是因?yàn)榉祷匕艘粋€(gè) ServerResponse 對(duì)象,而不是多個(gè)元素。
5.4 編寫(xiě)路由器類(lèi) Router新建 org.spring.springboot.router 包,作為編寫(xiě)路由器類(lèi)。新建城市(City)例子的路由類(lèi) CityRouter,代碼如下:
import org.spring.springboot.handler.CityHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.server.RequestPredicates;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
@Configuration
public class CityRouter {
@Bean
public RouterFunction routeCity(CityHandler cityHandler) {
return RouterFunctions
.route(RequestPredicates.GET("/hello")
.and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
cityHandler::helloCity);
}
}
RouterFunctions 對(duì)請(qǐng)求路由處理類(lèi),即將請(qǐng)求路由到處理器。這里將一個(gè) GET 請(qǐng)求 /hello 路由到處理器 cityHandler 的 helloCity 方法上。跟 Spring MVC 模式下的 HandleMapping 的作用類(lèi)似。
RouterFunctions.route(RequestPredicate, HandlerFunction) 方法,對(duì)應(yīng)的入?yún)⑹钦?qǐng)求參數(shù)和處理函數(shù),如果請(qǐng)求匹配,就調(diào)用對(duì)應(yīng)的處理器函數(shù)。
到這里一個(gè)簡(jiǎn)單的服務(wù)就寫(xiě)好了,下面怎么運(yùn)行該服務(wù)。
5.5 啟動(dòng)運(yùn)行項(xiàng)目一個(gè)簡(jiǎn)單的 Spring Boot Webflux 工程就開(kāi)發(fā)完畢了,下面運(yùn)行工程驗(yàn)證下。使用 IDEA 右側(cè)工具欄,點(diǎn)擊 Maven Project Tab ,點(diǎn)擊使用下 Maven 插件的 install 命令。或者使用命令行的形式,在工程根目錄下,執(zhí)行 Maven 清理和安裝工程的指令:
cd springboot-webflux-1-quickstart mvn clean install
在控制臺(tái)中看到成功的輸出:
... 省略 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:30 min [INFO] Finished at: 2017-10-15T10:00:54+08:00 [INFO] Final Memory: 31M/174M [INFO] ------------------------------------------------------------------------5.5.1 運(yùn)行工程
在 IDEA 中執(zhí)行 Application 類(lèi)啟動(dòng),任意正常模式或者 Debug 模式。可以在控制臺(tái)看到成功運(yùn)行的輸出:
... 省略 2018-04-10 08:43:39.932 INFO 2052 --- [ctor-http-nio-1] r.ipc.netty.tcp.BlockingNettyContext : Started HttpServer on /0:0:0:0:0:0:0:0:8080 2018-04-10 08:43:39.935 INFO 2052 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8080 2018-04-10 08:43:39.960 INFO 2052 --- [ main] org.spring.springboot.Application : Started Application in 6.547 seconds (JVM running for 9.851)
一看,確實(shí)是 Netty 啟動(dòng)的。
打開(kāi)瀏覽器,訪問(wèn) /hello 地址,會(huì)看到如圖所示的返回結(jié)果:
六、總結(jié)本文主要講了 Spring Boot 2.0 WebFlux 背景和快速入門(mén)使用。用的是基于功能性端點(diǎn)去創(chuàng)建一個(gè)服務(wù),但這個(gè)有點(diǎn)代碼偏多。下一章一個(gè) CRUD 我們使用注解控制層,讓開(kāi)發(fā)更方便。
系列教程目錄《01:WebFlux 系列教程大綱》
《02:WebFlux 快速入門(mén)實(shí)踐》
《03:WebFlux Web CRUD 實(shí)踐》
《04:WebFlux 整合 Mongodb》
《05:WebFlux 整合 Thymeleaf》
《06:WebFlux 中 Thymeleaf 和 Mongodb 實(shí)踐》
《07:WebFlux 整合 Redis》
《08:WebFlux 中 Redis 實(shí)現(xiàn)緩存》
《09:WebFlux 中 WebSocket 實(shí)現(xiàn)通信》
《10:WebFlux 集成測(cè)試及部署》
《11:WebFlux 實(shí)戰(zhàn)圖書(shū)管理系統(tǒng)》
代碼示例本文示例讀者可以通過(guò)查看下面?zhèn)}庫(kù)的中的模塊工程名: 2-x-spring-boot-webflux-handling-errors:
Github:https://github.com/JeffLi1993/springboot-learning-example
Gitee:https://gitee.com/jeff1993/springboot-learning-example
如果您對(duì)這些感興趣,歡迎 star、follow、收藏、轉(zhuǎn)發(fā)給予支持!
參考資料Spring Boot 2.x WebFlux 系列:https://www.bysocket.com/arch...
spring.io 官方文檔
以下專(zhuān)題教程也許您會(huì)有興趣《Spring Boot 2.x 系列教程》 https://www.bysocket.com/spri...
《Java 核心系列教程》 https://www.bysocket.com/arch...
(關(guān)注微信公眾號(hào),領(lǐng)取 Java 精選干貨學(xué)習(xí)資料)
(添加我微信:bysocket01。加入純技術(shù)交流群,成長(zhǎng)技術(shù))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74469.html
摘要:使用則需要及以上版本。開(kāi)發(fā)使用框架七系列教程目錄系列教程大綱快速入門(mén)實(shí)踐實(shí)踐整合整合中和實(shí)踐整合中實(shí)現(xiàn)緩存中實(shí)現(xiàn)通信集成測(cè)試及部署實(shí)戰(zhàn)圖書(shū)管理系統(tǒng) WebFlux 系列教程大綱 一、背景 大家都知道,Spring Framework 是 Java/Spring 應(yīng)用程序跨平臺(tái)開(kāi)發(fā)框架,也是 Java EE(Java Enterprise Edition) 輕量級(jí)框架,其 Spring ...
摘要:在配置下上面啟動(dòng)的配置數(shù)據(jù)庫(kù)名為賬號(hào)密碼也為。突出點(diǎn)是,即非阻塞的。四對(duì)象修改包里面的城市實(shí)體對(duì)象類(lèi)。修改城市對(duì)象,代碼如下城市實(shí)體類(lèi)城市編號(hào)省份編號(hào)城市名稱描述注解標(biāo)記對(duì)應(yīng)庫(kù)表的主鍵或者唯一標(biāo)識(shí)符。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 這是泥瓦匠的第104篇原創(chuàng) 文章工程: JDK...
摘要:二結(jié)構(gòu)這個(gè)工程會(huì)對(duì)城市進(jìn)行管理實(shí)現(xiàn)操作。負(fù)責(zé)將持久層數(shù)據(jù)操作相關(guān)的封裝組織,完成新增查詢刪除等操作。原因是,直接使用和是非阻塞寫(xiě)法,相當(dāng)于回調(diào)方式。反應(yīng)了是的好處集合了非阻塞異步。其實(shí)是的一個(gè)補(bǔ)充。可以發(fā)布類(lèi)型的元素。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 這是泥瓦匠的第102篇原創(chuàng) 0...
摘要:數(shù)據(jù)和信息是不可分離的,數(shù)據(jù)是信息的表達(dá),信息是數(shù)據(jù)的內(nèi)涵。數(shù)據(jù)本身沒(méi)有意義,數(shù)據(jù)只有對(duì)實(shí)體行為產(chǎn)生影響時(shí)才成為信息。主要目標(biāo)是為開(kāi)發(fā)提供天然的模板,并且能在里面準(zhǔn)確的顯示。目前是自然更加推薦。 這是泥瓦匠的第105篇原創(chuàng) 文章工程: JDK 1.8 Maven 3.5.2 Spring Boot 2.1.3.RELEASE 工程名:springboot-webflux-4-thym...
摘要:上一章我們提到過(guò)與,對(duì)于具體的介紹沒(méi)說(shuō)到,這一章我在這里簡(jiǎn)單介紹一下,既然提到和,那肯定得提到什么是響應(yīng)式編程,什么是。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 上一章我們提到過(guò)Mono 與 Flux,對(duì)于具體的介紹沒(méi)說(shuō)到,這一章我在這里簡(jiǎn)單介紹一下,既然提到Mono和Flu...
閱讀 3417·2023-04-26 02:25
閱讀 2609·2023-04-25 18:05
閱讀 863·2021-09-30 09:57
閱讀 3220·2021-09-27 14:10
閱讀 1900·2019-08-30 15:44
閱讀 1218·2019-08-29 15:28
閱讀 2743·2019-08-29 14:10
閱讀 2496·2019-08-29 13:30