作为一名 Java 的 web 后台工程师,如果你之前只知道 J2EE,SpringMVC,当你看到 Vert.x 的时候,我相信你一定会眼前一亮。一言以蔽之,它是 JVM 上的 Node.js。
Verticles
首先要提到一个概念叫 Verticle,Verticle 是一个组件,硬要类比的话 Verticle 之于 Vert.x 就像 servlet 之于 tomcat。下面就是一个 Verticle 的实现。当把这个 Verticle deploy 到 Vert.x 上的时候,web 服务就运行起来了,很酷有没有。
import io.vertx.core.AbstractVerticle;
public class Server extends AbstractVerticle {
public void start() {
vertx.createHttpServer().requestHandler(req -> {
req.response()
.putHeader("content-type", "text/plain")
.end("Hello from Vert.x!");
}).listen(8080);
}
}
Vert.x 的线程模型
每个 Verticle 被 deploy 的时候,这个 Verticle 就被绑定到某个线程上了,也就是说 Verticle 是单线程执行的。好处是不用担心多线程同步的问题了,但是这岂不是没法发挥多核服务器的性能了吗?
接下来要提到 Vert.x 一个重要的部分—— Event Bus,如下图所示。看图说话,Verticle 之间通过 Event Bus 通信,发布/订阅模式,松耦合,再经典不过的架构了。
总线
Vert.x 可以为每个核心创建一个线程,每个线程可以绑定多个 Verticle。线程模型如下所示。
线程模型
所以为了发挥多核的性能,完全可以 deploy 一个 Verticle 用来接收和分发 http 请求,deploy 多个逻辑处理的 Verticle 来处理请求,这不就是 Reactor 模型吗,殊途同归啊。
参考资料:
网友评论