vert.x詳細介紹,全異步框架

Vert.x是一個基於JVM、輕量級、高性能的應用平臺,非常適用於最新的移動端後臺、互聯網、企業應用架構。Vert.x基於全異步Java服務器Netty,並擴展出了很多有用的特性


github:  https://github.com/vert-x3

官網http://vertx.io/

介紹:

Vert.x誕生於2011年,當時叫node.x,不過後來因爲某些原因改名位Vert.x。經過三年多的發展,現在已經到了3.3.3版本,社區也越來越活躍,在最新的官網Vertx.io上,作者用一句話介紹了它,JVM上的Reative開發套件。Vert.x目前是見過最功能最強大,第三方庫依賴最少的Java框架,它只依賴Netty4以及Jacskon,另外如果你需要建立分佈式的Vert.x則再依賴HazelCast這個分佈式框架,注意Vert.x3必須基於Java8。由於基於JVM,所以Vert.x可以用其他語言來實現你的業務。

Vert.x是一個異步無阻塞的網絡框架,其參照物是node.js。基本上node.js能幹的事情,Vert.x都能幹。Vert.x利用Netty4的EventLoop來做單線程的事件循環,所以跑在Vert.x上的業務不能做CPU密集型的運算,這樣會導致整個線程被阻塞。


特性:

1、同時支持多種編程語言——目前已經支持了Java、Scala、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon等。對程序員來說,直接好處就是可以使用各種語言豐富的LIB,同時也不再爲編程語言選型而糾結;

2、異步無鎖編程——經典的多線程編程模型能滿足很多Web開發場景,但隨着移動互聯網併發連接數的猛增,多線程併發控制模型性能難以擴展,同時要想控制好併發鎖需要較高的技巧,目前Reactor異步編程模型開始跑馬圈地,而Vert.x就是這種異步無鎖編程的一個首選;

3、對各種IO的豐富支持——目前Vert.x的異步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;

極好的分佈式開發支持——Vert.x通過EventBus事件總線,可以輕鬆編寫分佈式解耦的程序,具有很好的擴展性;

4、生態體系日趨成熟——Vert.x歸入Eclipse基金會門下,異步驅動已經支持了Postgres、MySQL、MongoDB、Redis等常用組件,並且有若干Vert.x在生產環境中的應用案例。


Vert.x是基於事件的,提供一個事件驅動編程模型,使用Vert.x作爲服務器時,程序員只要編寫事件處理器event handler即可. 當TCP socket有數據時,event handler理解被創建調用,另外它還可以在以下幾種情況激活: '當事件總線Event Bus接受到消息時,' '當接收到HTTP消息時,' 當一個連接斷開時',' '當計時器超時時.'

作爲服務層處理邏輯這一層基本上對應的傳統Java裏的領域模型處理層.各種Service調用,以及對數據層的調用.差不多是一個承上啓下的一層.傳統的模型裏,這一層基本上都是同步調用,即使有異步調用,也是與業務邏輯分離的異步.如果全異步會導致業務邏輯碎亂.代碼很難描述清楚.到這裏你會發現Vert.x其實不太好融合到業務性很強的服務層裏.其主要原因如下
1、自身是異步體系,不適合描述順序邏輯性強的業務
2、由於異步的問題,訪問數據層也必須是異步,導致業務模型進一步碎片化.


Vert.x的執行單元叫verticle。即程序的入口,每個語言可能實現的方式不一樣,比如Java需要繼承一個AbstractVerticle抽象類

verticle分兩種,一種是基於EventLoop的適合I/O密集型的,還有一種是適合CPU密集型的worker verticle。而verticle之間相互通信只能通過Eventbus,可以支持point to point 的通信,也可以支持publish & subscribe通信方式。


重要的接口
org.vertx.java.core.Handler

Vert.x運行時的核心接口, 用於結果回調處理,你大部分的邏輯代碼都會在這裏執行.所以無需解釋.

org.vertx.java.core.Context
這個名詞的含義就是一個基於Vert.xAPI搭建起來的可運行的程序.這裏我們就簡單的理解繼承了org.vertx.java.platform.Verticle的Java類或者其他語言的腳本

那Context接口就代表着一次可執行單元的上下文,這裏的上下文只幹一件事情就是處理Handler裏的內容void runOnContext(Handler<Void> action);,

在Vert.x裏有兩種上下文,即EventLoop與Worker,而Worker又會分按順序執行的Worker與多線程Worker.這裏我們就先看成兩類EventLoop與Worker,什麼是EventLoop呢.
在Vert.x裏所有的事件包括IO都是依賴於Netty的EventLoop接口,而這個接口在Netty裏會一定的頻率調用.即當發生IO事件時,Netty會按時間比率分配CPU資源去響應這個事件.
在Vert.x裏你可以簡單的理解爲IO相關的事件就可以了,用了一個特定的線程池來響應這類請求.而Worker在Vert.x裏默認是一套按順序執行的Handler,即按照先來先到的順序依次執行,此類的請求是另一個線程池執行.


所有業務邏輯其實都會跑在Netty裏的EventLoop上,而EventLoop通過循環事件隊列來執行所有的業務邏輯,這樣可以把一些I/O操作頻繁的事件及時從CPU上剝離開來,最後通過註冊一個回調Handler來處理所有的事件回調


org.vertx.java.core.Vertx
這個其實就是API,非Vert.x擴展者,能用到的所有的東西都在這裏了.基於上面的三個接口,其實就能抽象出一個異步的模型,通過Vertx接口調用一個API,API內部會持有一個Context,在API本身的非業務邏輯執行完後,將Handler傳入Context執行.這大概就是整個Vert.x內部執行的流程,三個接口抽象出一個世界這便是軟件設計的哲學.

重要概念

Verticle

基於Vert.x框架實現的代碼包,就是一個Verticle,簡單點說,一個可以被Vert.x框架執行的代碼調用了Vert.xAPI的代碼就是一個Verticle.他可以用Scala Clojure JS Ruby等語言實現.多個Verticle實例可以並行的被執行.一個基於Vert.x的服務也許需要多個verticles來實現,而且要部署在多臺服務器上.他們之間通過vert.x事件進行通信.你可以之間通過vert.x命令啓動,也可以將verticle包裝成vert.x modules.

Module

Vert.x應用由一個或多個modules來實現.一個模塊呢由多個verticles來實現.你可以把module想象出一個個Java package.裏面可能是特定業務的實現,或者公共的服務實現(那些可以重用的服務).Vert.x編寫好的module,可以發佈到maven的倉庫裏.以zip包裝成二進制格式.或者發佈到vert.x module 註冊中心.實際上這種以模塊方式的開發,支撐着整個Vert.x生態系統.Module更多的信息,我需要單獨開一個系列來講解.

Event Bus

它是Vert.X的核心,在集羣中容器之間的通信,各個Verticle之間的通訊都是經過Event Bus來實現的,後期會推出一篇專門關於這個的文章,敬請等待。

Shared Data

它是Vert.X提供的一個簡單共享Map和Set,用來解決各個Verticle之間的數據共享

框架圖


實例:

public class HelloWorldEmbedded {
	public static void main(String[] args) {
	    // Create an HTTP server which simply returns "Hello World!" to each request.
	    Vertx.vertx().createHttpServer().requestHandler(req -> req.response().end("Hello World!")).listen(8080);
	  }

}

啓動一個verticle

 vertx.deployVerticle(DingtalksrvVertical.class.getName(), deploymentOptions, result -> {
		      if (result.succeeded()) {
		        String deployId = result.result();
		        System.out.println("Dingtalksrv 部署成功 [" + deployId + "]");
		        future.complete();
		      } else {
		        System.out.println("Dingtalksrv 部署失敗  " + result.cause().getMessage());
		        future.fail(result.cause());
		      }
		    });

啓動服務

HttpServerOptions options = createOptions();
    server = vertx.createHttpServer(options);
    server.requestHandler(mainRouter::accept);
    server.listen(result -> {
      if (result.succeeded()) {
        
      } else {
       
      }
    });
mainRouter = Router.router(vertx);
mainRouter.mountSubRouter("/api", router);
Router router = Router.router(vertx);
router.route(HttpMethod.POST, "/hello").handler(HelloHandler()::handleRequest);


異步封裝

executor.executeBlocking((Future<T> f) -> {
      try {
          jdbc_routine();
        }
        f.complete();
      } catch (SQLException e) {
        f.fail(e);
      }
    }, handler);

Vert.x3支持很多常用工具:metrics、熱部署、consul、kafka、mongo、redis等

有興趣可以到github上查看相應組件

Vert.x的執行單元叫verticle。即程序的入口,每個語言可能實現的方式不一樣,比如Java需要繼承一個AbstractVerticle抽象類

verticle分兩種,一種是基於EventLoop的適合I/O密集型的,還有一種是適合CPU密集型的worker verticle。而verticle之間相互通信只能通過Eventbus,可以支持point to point 的通信,也可以支持publish & subscribe通信方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章