{ vert.x } Vert.x初接觸

最近有點(diǎn)時(shí)間,關(guān)注了下Vert.x,從測(cè)試數(shù)據(jù)來(lái)看,性能不錯(cuò),適合目前移動(dòng)互聯(lián)網(wǎng)的高并發(fā)要求。

Vert.x 是什么

  • Polyglot(多種語(yǔ)言支持) (Java, JavaScript, Groovy, and Ruby)
  • Simplicity 編寫(xiě)的代碼是完全基于異步事件的,異步執(zhí)行并且通信是無(wú)阻塞的
  • Scalability(可擴(kuò)展) 基于Actor模型
  • Concurrency(并發(fā)性) Vert.x本身內(nèi)置三種線程池幫你處理
  • Modular(模塊化) Vert.x本身內(nèi)置強(qiáng)大的模塊管理機(jī)制
  • 分布式消息傳輸 Vert.x基于分布式Bus消息機(jī)制實(shí)現(xiàn)其Actor模型
  • WebSocket 支持WebSocket協(xié)議兼容SockJS

基本概念

Verticle

Vert.xAPI的代碼就是一個(gè)Verticle.他可以用Scala Clojure JS Ruby等語(yǔ)言實(shí)現(xiàn). 多個(gè)Verticle實(shí)例可以并行的被執(zhí)行.一個(gè)基于Vert.x的服務(wù)也許需要多個(gè)verticles來(lái)實(shí)現(xiàn),而且要部署在多臺(tái)服務(wù)器上. 他們之間通過(guò)vert.x事件進(jìn)行通信.你可以之間通過(guò)vert.x命令啟動(dòng),也可以將verticle包裝成vert.x modules.(推薦這么做)

Module

Vert.x應(yīng)用由一個(gè)或多個(gè)modules來(lái)實(shí)現(xiàn).一個(gè)模塊呢由多個(gè)verticles來(lái)實(shí)現(xiàn).你可以把module想象出一個(gè)個(gè)Java package. 里面可能是特定業(yè)務(wù)的實(shí)現(xiàn),或者公共的服務(wù)實(shí)現(xiàn)(那些可以重用的服務(wù)).Vert.x編寫(xiě)好的module,可以發(fā)布到maven的倉(cāng)庫(kù)里. 以zip包裝成二進(jìn)制格式.或者發(fā)布到vert.x module 注冊(cè)中心.實(shí)際上這種以模塊方式的開(kāi)發(fā),支撐著整個(gè)Vert.x生態(tài)系統(tǒng). Module更多的信息,我需要單獨(dú)開(kāi)一個(gè)系列來(lái)講解.

Vert.x 實(shí)例

Verticles 其實(shí)是跑在 Vert.x實(shí)例上的.所謂Vert.x實(shí)例其實(shí)就是一個(gè)運(yùn)行在某一個(gè)JVM上的Vert.x對(duì)象實(shí)例. 可以將多個(gè)Verticles運(yùn)行在一個(gè)Vert.x實(shí)例上,而vert.x實(shí)例可以跑在單個(gè)JVM上,也可以跑在其他JVM上,通過(guò)分布式event bus 來(lái)維持通信.注意vert.x實(shí)例其實(shí)是由vertx命令行啟動(dòng)的.你可以指定實(shí)例數(shù)目在單個(gè)JVM上.

Event Loops

上面提到Vert.x實(shí)例,每個(gè)Vert.x實(shí)例內(nèi)部維持幾個(gè)線程,線程數(shù)目基本與CPU核數(shù)一致.這些線程在Vert.x內(nèi)部叫做事件循環(huán)(Event Loop) 這個(gè)思想在很多事件驅(qū)動(dòng)的架構(gòu)都有,典型的就是IOS事件,它操作系統(tǒng)內(nèi)部也有一個(gè)事件監(jiān)控線程,不停捕捉外部的事件,比如touch,多點(diǎn)觸摸等. 然后分配到指定的處理函數(shù)上,在vert.x里這些處理函數(shù)是Handler接口. 在Vert.x里這些事件可以是從Socket里讀到數(shù)據(jù),或者是一個(gè)定時(shí)器觸發(fā),亦或是一個(gè)HTTP請(qǐng)求接受到. 一個(gè)部署好的verticle都會(huì)得到一個(gè)event loop,來(lái)處理相關(guān)的事件.相關(guān)的后續(xù)的處理都會(huì)在這個(gè)event loop解決掉(也就是一個(gè)線程里) ,注意在同一個(gè)時(shí)間里有且只有一個(gè)線程處理.即Handler接口里是線程同步的.這點(diǎn)非常類(lèi)似 reactor pattern.

不要在Event Loops寫(xiě)一些阻塞代碼,因此下面code不應(yīng)該存在

阻塞處理

事件處理之外肯定會(huì)發(fā)生其長(zhǎng)時(shí)間數(shù)據(jù)處理請(qǐng)求.比如處理一個(gè)圖片上傳,然后轉(zhuǎn)存到磁盤(pán)上等.或者一次長(zhǎng)時(shí)間的排序計(jì)算等. 在Verticle類(lèi)型里,有一種特別的verticle叫做Worker.不同于標(biāo)準(zhǔn)的verticle,他不使用event loop.而是采用vert.x內(nèi)部的 另一個(gè)線程池叫做worker pool.

其區(qū)別在于,worker verticles不會(huì)并行的執(zhí)行Handler.而是阻塞式的,等待上一個(gè)Handler處理完了,才會(huì)再執(zhí)行后面的請(qǐng)求.你可以 想象出隊(duì)列的方式執(zhí)行某些請(qǐng)求.

所以為了支持標(biāo)準(zhǔn)的與阻塞式的worker verticles, Vert.x 提供了一種混合線程模型,你可以選擇適當(dāng)?shù)哪P陀糜谀愕膽?yīng)用. worker verticle是一種阻塞式的方法,但是不可以做到并發(fā)水平擴(kuò)展的

共享數(shù)據(jù)

消息通過(guò)Bus可以在各個(gè)Vert.x實(shí)例直接傳輸.但是如果多個(gè)Verticle在一個(gè)Vert.x實(shí)例內(nèi),是可以避免進(jìn)行消息傳輸?shù)?比如單個(gè)JVM內(nèi),你不會(huì) 通過(guò)Socket互相在兩個(gè)Java 對(duì)象之間傳輸消息吧.但是因?yàn)閷?shí)例隔離,因?yàn)锳ctor模型,所以對(duì)象數(shù)據(jù)如果要傳到Handler里,必須通過(guò)消息傳輸. Vert.x提供了一個(gè)簡(jiǎn)單的共享Map與Set來(lái)解決這個(gè)問(wèn)題.數(shù)據(jù)被存儲(chǔ)到一個(gè)不可變的數(shù)據(jù)結(jié)構(gòu)了,各個(gè)實(shí)例直接通過(guò)此API獲取數(shù)據(jù).(看例子更容易)

Core API提供
  • TCP/SSL servers and clients
  • HTTP/HTTPS servers and clients
  • WebSockets servers and clients
  • The distributed event bus
  • Periodic and one-off timers
  • Buffers
  • Flow control
  • File-system access
  • Shared map and sets
  • Accessing configuration
  • SockJS

安裝

verx.io下載3.0,解壓設(shè)置環(huán)境變量
vertx -version

Hello world

package vertx;   
import io.vertx.core.AbstractVerticle;
public class Server extends AbstractVerticle{
  public void start () throws Exception {
    vertx.createHttpServer().requestHandler(req -> {
       req.response()
       .putHeader("content-type", "text/plain")
       .end("Hello World.");
        }).listen(8080);
   }
}

vertx run Server.java

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容