1.Vert.x保護那些組件,我們需要那些?從哪里開始?
Vert.x包含幾個不同的組件,旨在使您可以更輕松地用多種不同的語言編寫引人注目的反應(yīng)式應(yīng)用程序。Vert.x是高度模塊化的,你只需要使用所需的模塊即可,并且不要忘了Vert.x是一個庫,不是限制性容器,因此vert.x可以和其他組件一起使用,可以將Vert.x與所需的所有常用庫一起使用。
vertx.包含非常多的組件,我下面介紹幾個關(guān)鍵的常用組件。
Core: 也稱為Vertx的核心,Vert.x核心包含非常底層的功能,包括對HTTP,TCP,文件系統(tǒng)訪問和各種其他功能的支持。您可以在自己的應(yīng)用程序中直接使用它,而Vert.x的其他組件也可以使用它,這也是為什么稱之為核心的原因。
Vert.x-Web:是用于編寫復(fù)雜的現(xiàn)代Web應(yīng)用程序和HTTP微服務(wù)的工具包,如果你的微服務(wù)是提供高速的HTTP接口(不一定是restful 風(fēng)格,但推薦采用restful風(fēng)格), 那么vert.x web這個輕量級的庫是很好的選擇,你不必為你的微服務(wù)選擇龐大、復(fù)雜的servlet框架,配置servlet容器,vert.x-web提供了很簡潔高效的方式,僅僅啟動一個本地應(yīng)用程序,就能提供非常高性能的HTTP服務(wù)。
Vert.x Web client: 是易于使用的高級HTTP客戶端。?Vert.x Web客戶端是異步HTTP和HTTP / 2客戶端, 他的優(yōu)點是支持異步、支持HTTP2, 但不支持cookies的處理。 這樣的客戶端很多,相比apache的httpclient并沒有太大的優(yōu)勢,筆者不建議使用,但大家可以了解一下,會不會成為下一個牛逼的開源組件,也未嘗可知。
Web API Contract: 我翻譯成?API 契約,它擴展了Vert.x Web以支持OpenAPI 3,提供了一個簡單的接口來構(gòu)建路由規(guī)則,并很容易的添加安全性和驗證處理程序。
聽起來有點難懂,我先解釋一下什么是openAPI 3: 它是一套描述API的廣泛采用的行業(yè)標(biāo)準(zhǔn)。OpenAPI規(guī)范(OAS)是為REST API定義的標(biāo)準(zhǔn)的,它用編程語言無關(guān)的接口描述,它使人和計算機都可以發(fā)現(xiàn)和理解接口定義的服務(wù)的功能,而無需看源代碼,附加文檔或網(wǎng)絡(luò)抓包。 通過OpenAPI定義后,消費者可以使用最少的實現(xiàn)邏輯來理解遠(yuǎn)程服務(wù)并與之交互。 如果這聽著還是難懂,更簡單的理解,OpenAPI 提供了一套標(biāo)準(zhǔn),我們的接口文檔就用這套標(biāo)準(zhǔn)書寫,寫完之后人類很容易讀懂,機器也很容易讀懂,并生成相應(yīng)的代碼。聽起來簡直是人畜無害,有百利無一害。
但實際情況,這種方式在國內(nèi)的很多企業(yè)還沒有采用,很多小企業(yè)停留在開發(fā)人員隨意定義接口,代碼開發(fā)完了,才有接口文檔的階段,好一點的公司由架構(gòu)師提前把接口文檔寫在word文檔里面,供其他人參考。像筆者所在的大廠華為公司,采用API manager來管理API, API的定義采用open api 3.0 定義在一個yaml文件中,由架構(gòu)師定義接口以后,開發(fā)人員就可以直接基于Yaml文件生成對應(yīng)的客戶端和服務(wù)端,效率還是比較高的。
給讀者提一個問題,openAPI 和 RPC框架中的IDL由什么異同?
Web比較有代表性的就這些組件,還有些其他的組件,可以去vert.x的官網(wǎng)了解,這里有最及時和權(quán)威的資料,筆者的很多學(xué)習(xí)材料和心得也是參考官網(wǎng)而來的。
Vert.x Data Access: 數(shù)據(jù)訪問,Vert.x提供了一些異步客戶端,用于從程序訪問各種數(shù)據(jù)源。 并不想強迫你使用這些客戶端,你可以根據(jù)需要直接使用來數(shù)據(jù)庫廠商的客戶端(例如MongoDB提供自己的牛逼的異步和反應(yīng)式客戶端),但為什么vertx 還提供這些客戶端呢,這是因為這些客戶端提供了一個更簡單的異步API,并可以使用多種語言。
例如:Reactive PostgreSQL client、Reactive MySQL client、MongoDB client、Redis client、Cassandra client
這一章節(jié)按需使用的吧,需要了解詳細(xì)資料的移步vertx官網(wǎng)了解更多。vertx提供的組件還有很多,大部分讀者可能都用不到,還是一樣建議大家移步官網(wǎng),在此我就不做更多的介紹了,后面章節(jié)我會把精力放在Vert.x Core 和 Vertx.web這兩部分,這兩部分是vert.x的核心,也是廣大開發(fā)者有機會用到,對各位開發(fā)者最有價值的部分。
2.VERT.X原理介紹
Vert.x是基于在JVM上構(gòu)建響應(yīng)式程序的工具包(Vert.x is a tool-kit for building reactive applications on the JVM)。這句話的關(guān)鍵詞一個是JVM, 一個是響應(yīng)式程序。我們先看一下什么是響應(yīng)式程序。
2.1 Reactor模式
在開始介紹Reactor模式之前,先看看傳統(tǒng)的阻塞模式,在阻塞模式下,一個用戶請求(任務(wù)),我們啟動一個線程來處理,一個服務(wù)器它的線程資源是有限的,不可能無限制的啟動新線程,所以tomcat的并發(fā)并不好,往往Tomcat會在200個并發(fā)請求下,再無能力處理更多的請求,所以就要去單個請求的處理時間要非常短,但即便如此,也無法應(yīng)用互聯(lián)網(wǎng)模式下的高并發(fā)流量。
而Vertx完成采用另一個機制,用一個線程來接受請求(也可以是幾個,注意是幾個,不是幾百個),而把這個真正要執(zhí)行的任務(wù)委托給另外一個線程來執(zhí)行,從而不會堵塞當(dāng)前線程,與NodeJS的原理非常類似,如下圖(下圖是網(wǎng)上借用的一個圖):

2.2 Vert.x 的
事件模型
Vert.x是事件驅(qū)動的,其處理請求的高性能也是基于其事件機制。Vert.x的事件機制中有幾個非常重要的概念:Event Loop、Event Loop Vertical、Worker Vertical、Event Bus、Vert.x Module。
Event Loop:即事件循環(huán),是由Vert.x啟動的事件處理線程,也是Vert.x項目對外開放的入口,Vert.x由此接收請求事件。一個Vert.x有一個或多個事件循環(huán)線程組成,線程最大數(shù)量為主機有效的CPU核數(shù)。
Event Loop Vertical:事件的業(yè)務(wù)處理線程,存在于Event Loop中,用于處理非阻塞短任務(wù)。
Worker Vertical : 事件的業(yè)務(wù)處理線程,用于處理長任務(wù)阻塞任務(wù)。
Event Bus:即事件總線,是Vert.x事件模型中最核心的部分,所有的事件都經(jīng)由事件總線進行分發(fā),包括Vertical之間的通信事件。
Vert.x Module : Vert.x項目模塊,一個應(yīng)用通常由多個模塊組成,每個模塊一般包含多個Vertical。
上面這個幾個模型非常關(guān)鍵,我把他總結(jié)成一個單詞便于大家記憶: VE-WE(諧音是喂-喂,想不想是在兩人在打電話),這里面第一個E=Event Loop, V=Eventloop Verticle. 他們都運行在主線程中。W= Worker 是工作線程,第二個E= Event Bus.
下面這張圖描述了這幾個模塊之間的關(guān)系:Event Loop本質(zhì)就是線程的死循環(huán)在等待用戶的連接,接受到用戶的連接之后,通過EVENT BUS叫給WORKER 處理,worker 線程處理完之后,通過event bus 通知event loop的線程,返回給客戶端。因此可以看出來 event loop里面的 vertical 和 worker vertical 組成了一個vert.x module.?

2.3 事件模型流程
Vert.x以非阻塞IO的思想來實現(xiàn)高性能,非阻塞IO的實現(xiàn),基于Event Loop Vertical和Worker Vertical的分離,在Vert.x中,Event Loop用于接收,并將短業(yè)務(wù)操作交由其內(nèi)部的Vertical來處理,該模塊是非阻塞的,這樣可以保證請求的處理效率;阻塞任務(wù)通過Vert.x的事件機制脫離當(dāng)前線程,轉(zhuǎn)移到Worker Vertical中執(zhí)行,并執(zhí)行結(jié)果返回給Event Loop Vertical。 這一過程完成的核心是Event Bus,Event Bus中注冊了所有的事件,通過事件匹配完成事件轉(zhuǎn)移和結(jié)果返回,從而將整個流程銜接起來。
下面以一個HTTP請求的處理過程詳述Vert.x的事件處理流程。Vert.x啟動時,會將Worker Vertical的事件處理函數(shù)加載到Event Bus,當(dāng)一個HTTP請求發(fā)送到Vert.x構(gòu)建的應(yīng)用時,Event Loop首先接收到請求,并對請求做分析、包裝,然后將事件交給Event Bus來處理,Event Bus為此次請求事件添加一個事件ID,然后根據(jù)注冊的Worker Vertical事件尋找已經(jīng)注冊的監(jiān)聽函數(shù),若未找到則會拋棄該事件,若找到則會對處理類進行實例化,并同時使用事件ID在Event Bus中注冊一個返回結(jié)果處理事件,該事件為Event Vertical類型。下一步由Worker Vertical實例執(zhí)行事件處理函數(shù),事件處理函數(shù)中通常包含業(yè)務(wù)處理、數(shù)據(jù)庫操作等。Worker Vertical實例處理結(jié)束后,將返回結(jié)果和事件信息返回給Event Bus,Event Bus找到在其中注冊的Event Vertical實例,然后將返回數(shù)據(jù)交給該實例處理,Event Vertical實例進一步處理數(shù)據(jù)并將結(jié)果返回給瀏覽器。
2.4 數(shù)據(jù)傳遞
事件驅(qū)動的處理過程,數(shù)據(jù)傳遞是非常重要的,Vert.x支持任意對象的數(shù)據(jù)格式。但使用對象時經(jīng)常會遇到序列化和載入類的問題,比如在使用Java對象的時候,這種情況下使用JSON會更方便,這也是Vert.x推薦采用的方式。
3. 總結(jié)
Vert.x 包含很多模塊比如Vert.x core, Vert.x Web, Vert.x Client ,Vert.x API, Vert.x Data Access , 其中Vert.x Core是核心提供最基礎(chǔ)的TCP, HTTP請求處理功能,Vert.x Web用于構(gòu)建高并發(fā)非租塞式HTTP 服務(wù),是取代Servlet很好的替代品。
Vert.x的事件模型,最主要的概念VE-WE, 事件模型有如下幾個特點:
1.非阻塞處理請求,異步執(zhí)行阻塞程序,保證了請求處理的高效性。
2.使用Event Bus事件總線來進行通訊,可以輕松編寫出分布式、松耦合、高擴展性的程序。
有了本篇文章Vert.x的事件模型介紹作為基礎(chǔ),下一篇文章我們進入Vert core部分,了解其功能和特點,揭開其神秘的面紗。