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