原文及更多文章請見我的博客:http://heartlifes.comjava
直接轉載csdn上的文章:http://www.csdn.net/article/2015-05-20/2824733-Javareact
Vert.x簡介git
在Java20週年之際,Java用戶對Java的抱怨與日俱增,好比內存管理、笨重的JavaEE等。而Java依然在TIOBE編程語言排行榜上艱難的維持第一名的位置,隨着一些新編程語言的興起,這個領域目前呈現一種混戰的態勢。程序員
在這種背景下,Java屆的小鮮肉框架——Vert.x於2015年5月7日發佈了3.0-milestone5版本,距離計劃6月22日發佈Vert.x3.0.0-final愈來愈近了,Vert.x用戶組的粉絲們近期已經火燒眉毛地在宇宙中心(注:北京五道口)組織了一次Vert.x中國用戶組Meetup,針對Vert.x工程化開發問題以及Vert.x3新特性展開了探討。Vert.x(http://vertx.io/)是一個基於JVM、輕量級、高性能的應用平臺,很是適用於最新的移動端後臺、互聯網、企業應用架構。github
Vert.x基於全異步Java服務器Netty,並擴展出了不少有用的特性。Vert.x的亮點有:編程
同時支持多種編程語言——目前已經支持了Java、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon等。對程序員來講,直接好處就是可使用各類語言豐富的LIB,同時也再也不爲編程語言選型而糾結;瀏覽器
異步無鎖編程——經典的多線程編程模型能知足不少Web開發場景,但隨着移動互聯網併發鏈接數的猛增,多線程併發控制模型性能難以擴展,同時要想控制好併發鎖須要較高的技巧,目前Reactor異步編程模型開始跑馬圈地,而Vert.x就是這種異步無鎖編程的一個首選;服務器
對各類IO的豐富支持——目前Vert.x的異步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;多線程
極好的分佈式開發支持——Vert.x經過EventBus事件總線,能夠輕鬆編寫分佈式解耦的程序,具備很好的擴展性;架構
生態體系日趨成熟——Vert.x納入Eclipse基金會門下,異步驅動已經支持了Postgres、MySQL、MongoDB、Redis等經常使用組件,而且有若干Vert.x在生產環境中的應用案例。
Reactor模式
和傳統Java框架的多線程模型相比,Vert.x Netty是 Reactor模式的Java實現。考古了一下Reactor模式, 其理論最先由Washington University的Douglas C. Schmidt教授在1995年提出,在《Proactor - An Object Behavioral Pattern for Demultiplexing and Dispatching Handlers for Asynchronous Events 》這篇論文中作了 完整介紹。
圖1-6是對其關鍵原理部分展開分析。
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4aa7a1d95.jpg)
圖1 一個經典Web Server在收到Web瀏覽器請求後的處理過程
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4ac80015a.jpg)
圖2 一個經典Web Server使用多線程模型,併發處理來自多個Web瀏 覽器的請求
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4ad096c8f.jpg)
圖3 Web瀏覽器鏈接到一個Reactor模式的Web Server處理過程。利 用了Initiation Dispatcher組件,把耗時的IO操做事件註冊到Initiation Dispatcher組件
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4aeec8ad2.jpg)
圖4 Web瀏覽器訪問一個Reactor模式的Web Server處理過程。耗時IO 操做由其它線程執行,IO執行完成後通知Initiation Dispatcher,再回到 Http Handler執行
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4b083e44c.jpg)
圖5 Web瀏覽器鏈接一個Proactor模式的Web Server處理過程。和Reactor的主要區別是耗時IO操做交給操做系統異步IO庫執行(例如 GNU/Linux aio),操做系統異步IO庫執行完畢後,經過異步IO通知機制(例如epoll)觸發Completion Dispatch,再交給Http Handler執行
[請輸入圖片描述](http://img.ptcms.csdn.net/article/201505/20/555c4b1251f6b.jpg)
圖6 Web瀏覽器訪問一個Proactor模式的Web Server處理過程。和Reactor的主要區別是耗時IO操做交給操做系統異步IO庫執行(例如 GNU/Linux aio),操做系統異步IO庫執行完畢後,經過異步IO通知機制(例如epoll)觸發Completion Dispatch,再交給Http Handler執行
事實上,Vert.x/Netty的Reactor實現部分是在Netty 4.0如上述所示的代碼中實現,和上述圖中能對應的幾個類是io.netty.channel.nio.NioEventLoop,io.netty. channel.epoll.EpollEventLoop,java.nio.channels.spi.SelectorProvide。
Vert.x3.0的更新
Vert.x3.0是對Vert.x2.x的重大升級,不單單是package從org.vertx到io.vertx的全面替換,一些重要的核心類也都作了破壞式的重構,幾乎很難從vert.x2程序升級到vert.x3.0程序。建議新項目直接從Vert.x3.0開始。如下是Vert.x3的一些功能升級:
Vert.x2.x中的模塊體系去掉了。目前Vert.x3.0推薦用Maven的模塊體系,固然不只限於Maven;支持其餘語言在Vert.x上的代碼生成;
Vert.x3.0項目構建,從Gradle改成Maven;爲了更好地利用Java8的Lambdas表達式,只支持Java8;默認採用扁平的classpath結構;
Verticle工廠方式簡化;支持用編程的方式實例化Verticle、以及部署Verticle實例;當你阻塞Eventloop主線程時警告,阻塞Reactor主線程是一種錯誤的使用方式;移除了PlatformManager模塊;集羣管理能夠用編程的方式調用支持集羣節點之間的共享數據;徹底重寫了HTTPclient,更完善;
WebSocketAPI改善;
SSL/TLS的改善;
Eventbus的API改善;
支持Eventbus代理;增長了擴展項目集'ext'stack;
增長了MongoService,支持MongoDB的純異步驅動;
實現ReactiveStreams;
對reactive-streams的實現;
支持Options類的使用,能夠構造函數帶參數進去;
更完整的樣例工程。請見:https://github.com/vert-x3/example-proj