響應(yīng)式編程:Vert.x官網(wǎng)學(xué)習(xí)
本文基于 Vert.x 官網(wǎng) https://vertx.io/ 內(nèi)容,帶領(lǐng)大家學(xué)習(xí)響應(yīng)式編程里比較有名的工具包 Vert.x 。文章內(nèi)容取自官網(wǎng)由博主簡化總結(jié),希望幫助大家理解響應(yīng)式編程。
- Vert.x 簡介
- Vert.x 特性
- 響應(yīng)式模式概述
- 總結(jié)
推薦博主開源的 H5 商城項(xiàng)目waynboot-mall,這是一套全部開源的微商城項(xiàng)目,包含三個(gè)項(xiàng)目:運(yùn)營后臺(tái)、H5 商城前臺(tái)和服務(wù)端接口。實(shí)現(xiàn)了商城所需的首頁展示、商品分類、商品詳情、商品 sku、分詞搜索、購物車、結(jié)算下單、支付寶/微信支付、收單評(píng)論以及完善的后臺(tái)管理等一系列功能。技術(shù)上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中間件。分模塊設(shè)計(jì)、簡潔易維護(hù),歡迎大家點(diǎn)個(gè) star、關(guān)注博主。
github 地址:https://github.com/wayn111/waynboot-mall
Vert.x 簡介
官網(wǎng)首頁
先了解 Vert.x 是什么,官網(wǎng)首頁介紹文字可以看出 Vert.x 是由 Eclipse 開發(fā)的一個(gè)在 JVM 上 Reactive(響應(yīng)式) 應(yīng)用程序。
Reactive(響應(yīng)式)編程是什么?
響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程范式。這意味著可以在編程語言中很方便地表達(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過數(shù)據(jù)流進(jìn)行傳播。
例如在命令式編程設(shè)置中,a = b + c 意味著在計(jì)算表達(dá)式時(shí) a 被分配為 b + c 的結(jié)果,之后 b 和 c 的值進(jìn)行修改也不會(huì)影響 a 值。但是在響應(yīng)式編程中,只要 b 或 c 的值發(fā)生變化,a 的值就會(huì)自動(dòng)更新,而程序無需顯式地重新執(zhí)行語句 a = b + c 來確定當(dāng)前分配的 a 值。
如果你了解前端框架的 MVVM 思想,那么你應(yīng)該能理解這里說的 a = b + c 問題。
官網(wǎng)定義
官網(wǎng)對(duì)于 Vert.x 的定義是:一個(gè)用于在 JVM 上構(gòu)建響應(yīng)式應(yīng)用程序的工具包。
注意 Vert.x 是一個(gè)工具包,不是框架。
響應(yīng)式應(yīng)用程序既可以隨著工作負(fù)載的增長而擴(kuò)展,也可以在出現(xiàn)故障時(shí)具有彈性。響應(yīng)式應(yīng)用程序具有響應(yīng)能力,因?yàn)樗ㄟ^有效利用系統(tǒng)資源并保護(hù)自身免受錯(cuò)誤的影響來控制延遲。
響應(yīng)式編程不僅僅是體現(xiàn)在編碼 a = b + c 上,更體現(xiàn)在由其開發(fā)出程序的高性能和擴(kuò)展性上。
Microservices
Vert.x 還有一個(gè)大型響應(yīng)式模塊生態(tài)系統(tǒng)(即由 Eclipse 主導(dǎo)的 Vert.x 社區(qū))來提供支持,其中包含編寫現(xiàn)代服務(wù)時(shí)所需的任何內(nèi)容:全面的 Web 技術(shù)棧、響應(yīng)式數(shù)據(jù)庫驅(qū)動(dòng)程序、消息傳遞、事件流、集群、指標(biāo)、分布式跟蹤等。
Vert.x 特性
官網(wǎng)對(duì) Vert.x 的五個(gè)特性進(jìn)行了闡述。
特性
Resource-efficient(資源利用)
與基于阻塞 I/O 的傳統(tǒng)技術(shù)和框架相比,可以用更少的資源處理更多的請(qǐng)求。Vert.x 非常適合各種執(zhí)行環(huán)境,包括虛擬機(jī)和容器等受限環(huán)境。
劃重點(diǎn):不浪費(fèi)資源,提高部署密度,省錢!
Concurrent and asynchronous(并發(fā)和異步)
通常其他人告訴你異步編程很難,但我們努力使 Vert.x 編程變得很簡單,適合大多數(shù)人,同時(shí)不犧牲正確性和性能。
你可以選擇最適合當(dāng)前任務(wù)的模型:callback、Promise、Future、響應(yīng)式擴(kuò)展和 (Kotlin) 協(xié)程。
Flexible(使用靈活)
Vert.x 是一個(gè)工具包,而不是一個(gè)框架,因此它自然具有很強(qiáng)的可組合性和可嵌入性。Vert.x 對(duì)你的應(yīng)用程序結(jié)構(gòu)應(yīng)該沒有要求。
選擇你需要的模塊和客戶端,并在構(gòu)建應(yīng)用程序時(shí)組合它們。Vert.x 將始終根據(jù)你的需求進(jìn)行調(diào)整和擴(kuò)展。
Vert.x is fun(編碼有趣)
忘記復(fù)雜性和昂貴的抽象。使用 Vert.x,編寫的內(nèi)容實(shí)際上就是要執(zhí)行的內(nèi)容!回歸簡單的設(shè)計(jì),忘記一些既定的“最佳實(shí)踐”,并享受編寫易于理解的代碼是不會(huì)讓你失望的。
我們還有一個(gè)友好的社區(qū),因此你可以向在各種環(huán)境中使用過 Vert.x 的人們學(xué)習(xí)。
Ecosystem(生態(tài)系統(tǒng))
Web API、數(shù)據(jù)庫、消息傳遞、事件流、云、注冊表、安全性等應(yīng)有盡有。Vert.x 提供了適用于現(xiàn)代應(yīng)用程序的全面的端到端響應(yīng)式客戶端技術(shù)棧。
如果你找不到想要的東西,那么很有可能其他人已經(jīng)在更廣泛的 Vert.x 開源生態(tài)系統(tǒng)中找到了它。Vert.x 對(duì)于你的技術(shù)棧來說是一項(xiàng)很安全的投資。
響應(yīng)式模式概述
最開始是線程
并發(fā)的經(jīng)典方法是使用線程。多個(gè)線程可以存在于單個(gè)進(jìn)程中,執(zhí)行并發(fā)工作并共享相同的內(nèi)存空間。
大多數(shù)應(yīng)用程序和服務(wù)開發(fā)框架都基于多線程。從表面上看每個(gè)連接都有 1 個(gè)線程的模型令人放心,因?yàn)殚_發(fā)人員可以依賴傳統(tǒng)的命令式代碼。
多線程“簡單”但有限
當(dāng)工作負(fù)載超出工作負(fù)載時(shí)會(huì)發(fā)生什么?(參見 C10k 問題)
C10K 問題就是如何一臺(tái)物理機(jī)上同時(shí)服務(wù) 10000 個(gè)用戶?C 代表并發(fā),10K 就是 10000
答案:傳統(tǒng)的阻塞 I/O 模式中,正在進(jìn)行的請(qǐng)求會(huì)創(chuàng)建大量線程,因而需要進(jìn)行大量上下文切換工作,導(dǎo)致機(jī)器資源利用率偏低,因而難以解決C10k問題。
請(qǐng)求執(zhí)行時(shí),有些線程因?yàn)樵诘却?I/O 操作完成會(huì)被阻塞,有些線程準(zhǔn)備處理 I/O 結(jié)果,有些線程正在執(zhí)行 CPU 密集型任務(wù)。
雖然現(xiàn)代內(nèi)核有非常好的調(diào)度程序,但你不能指望它們能夠像處理 5?000 個(gè)線程那樣輕松地處理 50?000 個(gè)線程。而且創(chuàng)建線程代價(jià)也不小,創(chuàng)建一個(gè)線程需要幾毫秒,而一個(gè)新線程則需要大約 1MB 內(nèi)存。
異步編程:可擴(kuò)展性和資源效率
使用異步 I/O 時(shí),可以使用更少的線程處理更多并發(fā)連接。當(dāng) I/O 操作發(fā)生時(shí),我們不會(huì)阻塞線程,而是繼續(xù)執(zhí)行另一個(gè)已準(zhǔn)備好進(jìn)行的任務(wù),并在準(zhǔn)備就緒后恢復(fù)初始任務(wù)。
Vert.x 使用事件循環(huán)來實(shí)現(xiàn)并發(fā)工作負(fù)載。
在事件循環(huán)上運(yùn)行的代碼不應(yīng)執(zhí)行阻塞 I/O 或冗長的處理。但如果你有這樣的代碼,請(qǐng)不要擔(dān)心,Vert.x 有工作線程和 API 來處理事件循環(huán)中的事件。
選擇最佳的異步編程模型
我們知道異步編程需要付出更多的努力。在 Vert.x 的核心,我們支持 callbacks 和 Promise/Futures,后者是用于鏈接異步操作的簡單而優(yōu)雅的模型。
RxJava 雖然可以實(shí)現(xiàn)高級(jí)響應(yīng)式編程,但如果你更喜歡更接近傳統(tǒng)命令式編程的方式,Vert.x 也可以為你提供 Kotlin 協(xié)程的一流支持。
不要讓失敗破壞響應(yīng)能力
失敗總是會(huì)發(fā)生。數(shù)據(jù)庫將出現(xiàn)故障,網(wǎng)絡(luò)將出現(xiàn)故障,或者依賴的某些服務(wù)將變得無響應(yīng)。
Vert.x 提供了控制延遲的工具,包括簡單高效的斷路器。
豐富的生態(tài)系統(tǒng)
Vert.x 生態(tài)包含用于構(gòu)建現(xiàn)代端到端響應(yīng)式服務(wù)的模塊。從高效的響應(yīng)式數(shù)據(jù)庫客戶端到事件流、消息傳遞和 Web 技術(shù)棧,Vert.x的各個(gè)模塊可以分為以下幾類:
- 核心模塊:vertx-core,提供了基礎(chǔ)的TCP、HTTP、文件系統(tǒng)、事件總線等功能,是其他模塊的基礎(chǔ)。
- Web模塊:vertx-web,提供了路由器、模板引擎、身份驗(yàn)證、Web客戶端等功能,可以方便地開發(fā)Web應(yīng)用。
- 數(shù)據(jù)訪問模塊:vertx-jdbc-client,vertx-mongo-client,vertx-redis-client,vertx-mysql-client等,提供了對(duì)各種數(shù)據(jù)庫的異步訪問支持。
- 消息模塊:vertx-rabbitmq-client,vertx-kafka-client,vertx-amqp-client等,提供了對(duì)各種消息中間件的異步訪問支持。
- 各語言模塊:Vert.x 支持多種編程語言,如Java、JavaScript、Ruby、Python、Groovy、Scala等,并提供了友好的API接口。
- 微服務(wù)模塊:vertx-service-discovery,vertx-circuit-breaker,vertx-config等,提供了服務(wù)發(fā)現(xiàn)、熔斷器、配置管理等功能,可以幫助開發(fā)微服務(wù)應(yīng)用。
- 其他模塊:還有一些其他的模塊,如vertx-mail-client,vertx-auth-common,vertx-dropwizard-metrics等,提供了郵件客戶端、認(rèn)證、監(jiān)控等功能。
總結(jié)
Vert.x 是一個(gè)基于 JVM 的輕量級(jí)、高性能響應(yīng)式工具包,適用于最新的服務(wù)端后臺(tái)、互聯(lián)網(wǎng)、企業(yè)應(yīng)用架構(gòu)。Vert.x 基于全異步的事件驅(qū)動(dòng)和非阻塞的 IO 模型,可以使用很少的線程資源處理大量并發(fā)請(qǐng)求。Vert.x 還提供了分布式系統(tǒng)、微服務(wù)、數(shù)據(jù)庫、消息傳輸、web開發(fā)支持等特性,使得開發(fā)者可以輕松編寫響應(yīng)式應(yīng)用程序,具有很好的擴(kuò)展性和可靠性。