初始Vert.x

Vert.x框架最近比较火,它号称JVM上的Node.js。

http://vertx.io/

它目前支持JavaScript,Groovy,Ruby,Java,正在对Clojure,Scala,Python等。跟node.js一样,它是异步的、基于EDA的架构,跟Node.js一样,它拥有良好的并发及消息传递性能。

它支持HTTP/HTTPS,同时支持WebSockets,sockjs等高级协议。

其官方的benchmark相当漂亮:

Vert.x Benchmark


###event-driven模型

在vert.x内部,每一个vert.x实例称为一个verticle。verticle被bind到一个统一的event bus上,进行事件循环。其中一部分verticle是提供一些共享的lib(如共享的event handler),这种verticle被称为busmod。

通过event bus,Verticle可与运行在相同或不同vert.x实例中的其他verticle进行通信(基于Actor model)。

Vert.x verticle


###vert.x的线程模型

在vert.x中,每一个verticle(busmod)都被绑定到一个特殊的线程,所以在对verticle进行开发时,无需关注他的线程安全性。因此,对于vert.x instance,它管理着一个Thread Set,每个线程都维护了一个event loop。vert.x内部通过一个线程池,选择将一个event循环分配给具体的verticle。具体的线程响应模型采用了Reactor pattern

###内部实现

从其事件处理流程上很容易想到netty,vert.x在底层确实使用了netty。通过netty来处理高并发响应,reactor式的分派请求。vertx的ClusterManager基于Hazelcast进行轻量级实现。

具体细节还得看代码细节,有机会再分享https://github.com/vert-x/vert.x

简单的实现demo

1
2
3
4
5
6
7
8
9
Vertx vertx = Vertx .newVertx();
vertx.createHttpServer().requestHandler(
new Handler< HttpServerRequest>() {
public void handle(HttpServerRequest req) {
String file = req.path.equals( "/" ) ? "index.html"
: req.path;
req.response.sendFile( "webroot/" + file);
}
}).listen(8080);