Vert.x Core 手册
Vert.x Core作为Vert.x的核心,提供了一组Java API。Vert.x Core 源码
Vert.x Core提供了如下功能:
- 开发
TCP
客户端和服务器 - 开发支持
WebSockets
的HTTP
客户端和服务器 - 事件总线
- 共享数据--本地缓存和分布式集群缓存
- 周期性、延迟性动作
- 部署、卸载
Verticles
实例 - 数据报套接字
DNS
客户端- 文件系统访问
- 高可用
- 集群
Vert.x Core中提供的功能相当底层--你在此不会找到如数据库访问、授权或Web应用的功能。你可以在Vert.x ext
(扩展组件)中找到它们。
Vert.x Core小而轻量。你可以仅仅使用你需要的部分。它可以完全嵌入到已经存在的应用当中--仅为了使用Vert.x我们并不强制你以一种特殊的 方式重构你的应用。
你可以在任何Vert.x支持的语言中使用Vert.x Core。很酷的是:我们并不强迫你在书写如JavaScript
或Ruby
时直接调用Java API,毕竟不同
的语言有不同的风格,若强行让Ruby
开发者遵循Java
的代码风格会很怪异,因此我们根据Java API自动生成了适应不同语言风格的API。
从现在开始我们将使用关键字core来代指Vert.x Core。
如果你在使用Maven
或者Gradle
,你可以将下面的依赖添加到项目的dependencies
配置中来使用Vert.x Core API:
- Maven(
pom.xml
)
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>4.3.2</version>
</dependency>
2
3
4
5
- Gradle(
build.gradle
)
dependencies {
compile 'io.vertx:vertx-core:4.3.3'
}
2
3
接下来让我讨论core的不通概念和特性。
# Vert.x 启程
在Vert.x领域,在不使用Vertx
对象的情况下你做不了任何事情。
Vertx
是Vert.x的控制核心,通过它可以做很多事情,包括创建客户端和服务器,获取事件总线的引用,设置定时器等等。
那如何获取Vertx
对象的实例呢?
如果你嵌入了Vert.x
那么你可以使用下面的代码简单的创建一个对象实例:
Vertx vertx = Vertx.vertx();
注意
大多数应用可能仅仅需要一个Vertx
对象实例,但如果你需要,创建多个实例也是可行的,比如,事件总线或不通服务器和客户端组之间的隔离。
# 配置Vertx对象
当创建Vert.x
对象时如果默认配置不满足你的要求,可以自定义设置相关配置。
Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(40));
VertxOptions
对象包含很多配置项,包括配置集群、高可用、工作线程池数量等等。
# 创建一个集群Vert.x对象
如果你准备创建集群Vert.x
(参阅事件总线获取集群事件总线的更多信息),你通常需要使用异步变量来创建Vertx
对象。
这是因为将集群中的Vert.x
实例组合到一起需要一些事件(可能几秒)。在此期间,我们不想阻塞调用线程,因此我们异步返回结果。
# 是流式的吗?
你可能已经注意到了,在上一个示例中使用了流式的API。流式API可以将多个方法调用串联到一起。比如:
request.response().putHeader("Content-Type", "text/plain").end("some text");
这在Vert.x APIs
当中是常见的模式,所以要习惯这种写法。
像这样的链式调用可以让你写的代码不那么冗长。当然,如果你不喜欢这种流式方法我们也不强制你这样做,如果你更喜欢西面的写法你也可以忽略 他们:
HttpServerResponse response = request.response();
response.putHeader("Content-Type", "text/plain");
response.write("some text");
response.end();
2
3
4
# 不要调用我们,我们会调用你
Vert.x APIs
是事件驱动。这意味着当在Vert.x
中有你感兴趣的事情发生时,Vert.x
会通过发送事件的形式通知你。
一些常见的事件如下:
- 定时器已经启动
socket
接收到数据- 从磁盘读取到数据
- 发生了异常
HTTP
服务器收到了请求
你可通过提供handlers
程序来处理事件。比如每秒接收定时器事件,你可以这样做:
vertx.setPeriodic(1000, id -> {
// This handlere will get called every second
System.out.println("timer fired!")
});
2
3
4
或者接收HTTP
请求:
server.requestHandler(request -> {
// This handler will be called every time an HTTP request is received at the server
request.response().end("hello world!");
});
2
3
4
一段事件后,当Vert.x
有一个事件传递给你的handler
时,Vert.x
将异步地调用它。
这就为我们引出了Vert.x
的一些重要概念:
# 不要阻塞我
少有例外(如,一些文件系统操作以Sync
结束),在Vert.x
中没有APIs阻塞调用线程。