Vert.x是什麼
Vert.x(http://vertx.io/)是一個基於JVM、輕量級、高性能的應用平臺,很是適用於最新的移動端後臺、互聯網、企業應用架構。
Vert.x框架基於事件和異步,依託於全異步Java服務器Netty,並擴展了不少其餘特性,以其輕量、高性能、支持多語言開發而備受開發者青睞。
官網是這麼說的,Vert.x is a tool-kit for building reactive applications on the JVM. 我理解或者說是亂翻譯的意思是,Vert.x是一個開發基於JVM的響應式應用的工具。官網:
http://vertx.io/
自帶屬性
簡單點講,就是隻要是JVM上的主流語言,均可以直接編寫基於Vert.x的應用.目前官方推出的有java, Javascript, Groovy, Ruby,和Ceylon
這裏的簡單意味着你編寫的代碼是徹底
基於異步事件
的,相似Node.JS,與此同時.你不須要關注線程上的同步,與鎖之類的概念,全部的程序都是
異步執行而且通訊是無阻塞的
由於基於Actor模型,因此你的程序都是一個點一個點的單獨在跑,一羣點能夠組成一個服務,某個點都是能夠水平擴展,動態替換,這樣你的程序,基本就能夠達到無限制的水平擴展
此併發並不是JDK庫的併發,當你Coding的時候,再也不關注其鎖,同步塊,死鎖之類的概念,你就能夠隨性所欲的寫本身的業務邏輯.Vert.x自己內置三種線程池幫你處理
Vert.x自己內置強大的模塊管理機制,當你寫完一個Vert.x業務邏輯的時候,你能夠將其打包成module,而後部署到基於Maven的倉庫裏,與現有主流的開發過程無縫結合.so easy…
Vert.x基於分佈式Bus消息機制實現其Actor模型,簡單點講每一個Vert.x實例均可以與其餘節點內置的通訊接口,底層上實現框架內部的消息同步與傳輸,相似Erlang的ping pong自檢消息.而咱們的業務邏輯若是依賴其餘Actor則經過Bus簡單的講消息發送出去就能夠了
支持WebSocket協議兼容SockJS
目前Vert.x的異步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等
經典的多線程編程模型能知足不少Web開發場景,但隨着移動互聯網併發鏈接數的猛增,多線程併發控制模型性能難以擴展,同時要想控制好併發鎖須要較高的技巧,目前Reactor異步編程模型開始跑馬圈地,而Vert.x就是這種異步無鎖編程的一個首選
Vert.x納入Eclipse基金會門下,異步驅動已經支持了Postgres、MySQL、MongoDB、Redis等經常使用組件,而且有若干Vert.x在生產環境中的應用案例
官網首頁最後還說了一句:Vert.x is
fun
而且顯擺了下都有哪些公司在使用它們,
那好吧
。
Reactor模式
和傳統Java框架的多線程模型相比,Vert.x Netty是 Reactor模式的Java實現
一般Tomcat會在100個併發長請求下堵塞,而Vertx將長任務委託給另一個線程來執行,從而不會堵塞當前線程,與NodeJS的原理很是相似,以下圖:
基本概念
Verticle
Vert.x的代碼執行包,它能夠用JS、Ruby等多語言來編寫,在同一個Vert.x實例中能夠同時執行多個Verticle,一個應用可能由多個Verticle組成,他們被部署到不一樣的網絡節點上,彼此之間經過在Vert.x的事件總線(event bus)上交換信息來通訊。對於具體的verticle能夠直接從命令行啓動,可是一般會將它打包成modules
Module
Vert.x應用由一個或多個modules來實現.一個模塊由多個verticles來實現.你能夠把module想象出一個個Java package.裏面多是特定業務的實現,或者公共的服務實現(那些能夠重用的服務).Vert.x編寫好的module,能夠發佈到maven的倉庫裏.以zip包裝成二進制格式.或者發佈到vert.x module 註冊中心.實際上這種以模塊方式的開發,支撐着整個Vert.x生態系統
Vert.x 實例
Verticles 實際上是跑在 Vert.x實例上的.所謂Vert.x實例其實就是一個運行在某一個JVM上的Vert.x對象實例.能夠將多個Verticles運行在一個Vert.x實例上,而vert.x實例能夠跑在單個JVM上,也能夠跑在其餘JVM上,經過分佈式event bus來維持通訊.注意vert.x實例實際上是由vertx命令行啓動的.你能夠指定實例數目在單個JVM上
Event Loops
即事件循環,是由Vert.x啓動的事件處理線程,也是Vert.x項目對外開放的入口,Vert.x由此接收請求事件。一個Vert.x有一個或多個事件循環線程組成,線程最大數量爲主機有效的CPU核數。
上面提到Vert.x實例,每一個Vert.x實例內部維持幾個線程,線程數目基本與CPU核數一致.這些線程在Vert.x內部叫作事件循環(Event Loop)這個思想在不少事件驅動的架構都有,典型的就是IOS事件,它操做系統內部也有一個事件監控線程,不停捕捉外部的事件,好比touch,多點觸摸等.而後分配到指定的處理函數上,在vert.x裏這些處理函數是Handler接口.在Vert.x裏這些事件能夠是從Socket裏讀到數據,或者是一個定時器觸發,亦或是一個HTTP請求接受到.一個部署好的verticle都會獲得一個event loop,來處理相關的事件.相關的後續的處理都會在這個event loop解決掉(也就是一個線程裏),注意在同一個時間裏有且只有一個線程處理.即Handler接口裏是線程同步的.這點很是相似 reactor pattern.
不要在Event Loops寫一些阻塞代碼,所以下面code不該該存在
- Thread.sleep()
- Object.wait()
- CountDownLatch.await()
並且若是是長時間的計算也不該該存在.更不可能發生長時間的IO堵塞,典型的就是JDBC查詢
Event Loop Vertical
事件的業務處理線程,存在於Event Loop中,用於處理非阻塞短任務
Event Bus
它是Vert.X的核心,在集羣中容器之間的通訊,各個Verticle之間的通信都是通過Event Bus來實現的
Shared Data(共享數據)
它是Vert.X提供的一個簡單共享Map和Set,用來解決各個Verticle之間的數據共享。
消息經過Bus能夠在各個Vert.x實例直接傳輸.可是若是多個Verticle在一個Vert.x實例內,是能夠避免進行消息傳輸的.好比單個JVM內,你不會經過Socket互相在兩個Java 對象之間傳輸消息吧.可是由於實例隔離,由於Actor模型,因此對象數據若是要傳到Handler裏,必須經過消息傳輸.
Vert.x提供了一個簡單的共享Map與Set來解決這個問題.數據被存儲到一個不可變的數據結構了,各個實例直接經過此API獲取數據.(看例子更容易)
Worker Vertical (阻塞處理)
事件的業務處理線程,用於處理長任務阻塞任務。
事件處理以外確定會發生其長時間數據處理請求.好比處理一個圖片上傳,而後轉存到磁盤上等.或者一次長時間的排序計算等.
在Verticle類型裏,有一種特別的verticle叫作Worker.不一樣於標準的verticle,他不使用event loop.而是採用vert.x內部的另外一個線程池叫作worker pool.其區別在於,worker verticles不會並行的執行Handler.而是阻塞式的,等待上一個Handler處理完了,纔會再執行後面的請求.你能夠想象出隊列的方式執行某些請求.因此爲了支持標準的與阻塞式的worker verticles, Vert.x 提供了一種混合線程模型,你能夠選擇適當的模型用於你的應用.
worker verticle是一種阻塞式的方法,可是不能夠作到併發水平擴展的
參考: