2012年12月1日

Vert.x 非同步網站應用開發利器、Java 版本的 Node.js

Vert.x
Effortless asynchronous application development for the modern web and enterprise

愈來愈多人認識 Node.js 之後,相信有更多開發者受到啟發,對高效能網站應用程式的設計思維,有了新的發展方向。身為熱血程式設計師(Passionate Programmer),我們擁抱新技術、接受新觀念,並融入自己的開發理念之中。

很多人知道 Java 是個又老又肥的大怪獸,不過卻忽視近年 Java 的另一面貌。Java 就像一個老舊城市的商業區,路過的人看一眼就覺得它該被夷為平地、重蓋比較快,偶爾走近一看,又驚訝地發現這裡居然在智慧型手機時代賣黑金剛;直到你深入了解它的另一個面貌,才發現不少文創的領頭羊,早已利用龐大的城市遺產建立一個年輕有活力的新地帶。

就像過去 Ruby on Rails 帶來可用且廣受歡迎的 MVC 實作方式,敏捷的 Java 開發者,早已利用 Groovy on Grails 享受一樣好的開發方式。

現在由 Node.js 所啟發的 Asynchronous、Event-driven、Non-blocking I/O,建立快速、高延展性(scalable)應用程式的特性,在敏捷 Java 世界也開始出現相同理念的產物。

Vert.x 帶來全新 Java 高效能網站應用開發方式;先看一個最簡單的範例,這是使用 Vert.x + JavaScript 開發的 Hello World 應用。

Vert.x
http://vertx.io/

load('vertx.js')

vertx.createHttpServer().requestHandler(function(req) {
    var file = req.path === '/' ? 'index.html' : req.path;
    req.response.sendFile('webroot/' + file);
}).listen(8080)

這個故事其實已經有些歷史,從 Java 1.4 開始加入 NIO(New I/O) API,提供改良的 I/O 存取操作方法。而 Java 7 更提供增強的 File I/O (NIO.2),開始提供 Asynchronous I/O、Socket Channel API 等特性,在 Java VM 的基礎上打造高效能 HTTP/Socket 服務已經看到曙光。

然而廣泛使用的 Tomcat / Jetty 等 Java EE 容器(Container、Java 的網站伺服器軟體),有著歷史包袱的負擔,當然不可能一夕之間就出現太多效能演進;就像 Apache 也沒辦法拿來跟 Nginx 拼效能。

此時由 JBoss 創始的 Netty 專案,帶來一項新的 client-server 應用發展,全新的非同步事件驅動應用框架(asynchronous event-driven network application framework)。

Netty
https://netty.io/


可是許多年來,Netty 就像雞肋一般,食之無味,棄之可惜。在搭配傳統 Java 程式語言的情況下,即使可以打造高效能應用服務,但開發過程所撰寫的代碼還是沒有太多改善;比起撰寫 Ruby / PHP ... 等現代語言的歡樂,用 Java 寫 Code 只有麻煩兩字而已。

然而 Java VM(JVM)最早的設計就有多語言(polyglot)特性,類似 .NET 上可以寫 C#、VisualBasic、JScript 等;雖然長久以來只有 Java 語言本身較廣為人知,但是近年來 JVM Scripting (JSR-223: Scripting for the Java platform)為 Java 世界帶來不少新面貌。

例如有 JRuby 及 Jython 讓 Java 開發者也能直接以 Ruby / Python 開發應用,更有 Rhino 這個 Mozilla 發展已久的 JavaScript Engine,讓 Java 世界更容易混搭不同程式語言,直接共享既有龐大 API Library。

其中不能錯過的是近年發展快速的 Groovy,一個簡化 Java 又加入各種現代語言特性的新語言,學習門檻低且執行速度不斷改善。

這篇文章的測試過程以 Ubuntu Server 12.10,建議利用 VirtualBox 快速建立開發環境。
  1. 下載安裝 VirtualBox 軟體。
  2. 下載 Pre-Build Images(預先安裝配置好的虛擬機器),建議使用 Ubuntu Linux Server Edition 12.10 x86(預設登入帳號密碼 ubuntu/reverse)。
建立好 Ubuntu Server 後,先用 ifconfig 查詢虛擬機器的 IP 位址(例如 192.168.0.100),使用 SSH 遠端連線。

ssh ubuntu@192.168.0.100

先安裝 Java 7 (OpenJDK)與相關軟體。

sudo apt-get update
sudo apt-get install openjdk-7-jdk zip

在 ~/.profile 加入 JAVA_HOME 環境變數設定。

echo 'export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-i386' >> ~/.profile

重新登入(或手動執行上述 export 指令)。

安裝 GVM(Groovy enVironment Manager)。

curl -s get.gvmtool.net | bash

重新登入(讓 GVM 環境變數生效)或執行「source ~/.gvm/bin/gvm-init.sh」。

安裝 vert.x。

gvm install vert.x

新建 webroot 資料夾。

mkdir webroot

編輯 webroot/index.html 網頁源碼。

echo '<p>Hello World</p>' > webroot/index.html

建立 server.js 檔案(以下指令一次執行)。

cat > server.js << EOF
load('vertx.js')

vertx.createHttpServer().requestHandler(function(req) {
    var file = req.path === '/' ? 'index.html' : req.path;
    req.response.sendFile('webroot/' + file);
}).listen(8080)
EOF

使用 Vert.x 執行 server.js 程式。

vertx run server.js

開啟瀏覽器打開網頁。

http://192.168.0.100:8080/

這是 Vert.x 最簡易的範例,將靜態網站內容原封不動送回給瀏覽器。

至於很多人關心的「效能」議題,Vert.x 被拿來與 Node.js 作比較,以下這篇文章內容可供參考。

Vert.x vs node.js simple HTTP benchmarks


在相同靜態檔案的 HTTP Request 壓力測試下,Single Process 的 Vert.x 明顯比 Node.js 能回應更多的存取量。當然這樣的比較結果只能說明 Vert.x 效能並不差,對於實際應用服務的開發,效能還是有賴開發者的調校功力。

Vert.x 帶來新的應用想像空間,在 Java VM 的基礎上,無論是 Java、Ruby、Groovy 或 JavaScript 的愛好者,都能使用自己最擅長的語言打造高效能應用服務。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!