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