Vert.x是什么
Vert.x是Eclipse基金会下的一个开源项目,基于Eclipse Public License(EPL)2.0和Apache License 2.0双重许可,是一个基于JVM的用于构建响应式(reactive)应用程序的工具包。
Vert.x基于Netty,但不仅仅局限于开发可扩展的高性能网络服务器和客户端。通过可扩展模块(module),Vert.x构建了庞大的响应式模块生态系统(类似于Spring开箱即用全家桶),具有编写现代服务所需的一切:全面的Web技术栈,响应式数据库驱动程序、消息队列、事件流、集群支持、指标监控、分布式跟踪等等。
Vert.x是轻量级的工具包,而不是框架。Vert.x对应用程序架构没有强制要求,因此很容易组合和嵌入现有应用程序。可以在其它框架(如springboot)中轻松整合Vert.x。
Vert.x中文社区(https://vertx-china.github.io/)对于像我一样英文不好的初学者是一个不错的入门网站,可以看作是中文版的官网。类似于Spring Initializr,Vert.x也有在线的项目生成工具(https://start.vertx.io/)。如前面介绍的,Vert.x是轻量级的工具,对应用程序架构没有强制要求,我们可以通过添加依赖的方式在已有的项目中使用Vert.x。其中Vert.x Core模块(vertx-core)是Vert.x的核心Java API,必须添加。而其它的模块称为Vert.x ext(扩展包),不是必须的,可根据需要添加。Vert.x各模块的介绍在"文档"中(https://vertx-china.github.io/docs/)。
Vert.x版应答服务
我们使用Vert.x实现应答服务器,因为vertx-core已经包含TCP Server功能,所以我们只需要在maven项目中添加Vert.x Core依赖即可。
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>4.5.10</version>
</dependency>
以下是实现代码:
import io.vertx.core.Vertx;
import io.vertx.core.net.NetServer;
import io.vertx.core.net.NetServerOptions;
public class VertxEchoServer {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetServerOptions option = new NetServerOptions().setHost("0.0.0.0").setPort(3000);
NetServer server = vertx.createNetServer(option);
server.connectHandler(socket -> { // A connect handler for this server.
socket.handler(buffer -> { // As data is read, the handler will be called with the data.
// System.out.println(socket.remoteAddress() + " -> (" + buffer.length() + " bytes): "+ buffer.toString() );
socket.write(buffer);
});
})
.listen()
.onFailure(ex -> ex.printStackTrace());
}
}
Vert.x提供一个事件驱动编程模型,Vert.x中的几乎所有API(方法)都是异步的,都不会阻塞调用线程。可以立即提供结果的API会立即返回,否则您需要提供一个处理器(Handler)来接收稍后回调的事件。
在Vert.x版应答服务中我们只需编写两个处理器: 连接处理器(Handler<NetSocket>
),在其回调方法(handle)中为建立的客户端NetSocket添加客户端读取处理器;客户端读处理器(Handler<Buffer>
),在其回调方法(handle)中将接收到的客户端数据回写。如果我们不使用Lambda表达式,而是传统得写法,可以看得更清晰。
NetServer server = vertx.createNetServer(option);
Handler<NetSocket> connectHander = new Handler<NetSocket>() {
@Override
public void handle(NetSocket socket) {
Handler<Buffer> readHandler = new Handler<>() {
@Override
public void handle(Buffer buffer) {
socket.write(buffer);
}
};
socket.handler(readHandler);
}
};
server.connectHandler(connectHander);
Future<NetServer> future = server.listen();
Handler<Throwable> failureHandler = new Handler<>() {
@Override
public void handle(Throwable ex) {
ex.printStackTrace();
}
};
future.onFailure(failureHandler);
相对于之前得NIO版本应答服务器,使用Vert.x让异步编程变得简单许多,Vert.x 的API大部分都是事件驱动的,我们只需要为我们感兴趣的事件编写响应代码,当感兴趣的事情发生时,Vert.x调用您提供的处理器(Handler)来处理事件。
Vert.x中的大部分都是异步(非阻塞)的,异步的方法大都会返回一个Future对象,来处理异步结果。如上例的server.listen()方法,我们为Future添加了一个失败处理器(Handler<Throwable>
),当NetServer监听失败时候印打印异常堆栈信息。