’Vert.x导论‘回顾
在Vert.x 导论之一:第一个Vert.x 3 应用中,我们开发了一个很简单的Vert.x 3应用,并测试,打包执行了这个应用。然而这只是个开始,在这个贴子中,我们将支持外部配置来加强我们的应用。
我们的应用在8080端口上启动了一个HTTP服务器,对所有HTTP请求返回"Hello"消息。之前的代码可以在这里找到。这篇帖子中的代码在这里。
为什么我们需要配置
这是个好问题。应用现在工作了,但是如果你想要把它部署在一台8080端口已经被占用的机器上的话。我们就需要劳民伤财的修改在应用代码和测试代码中的端口号。这令人气馁。所幸Vert.x应用是可以配置的。
Vert.x配置使用JSON格式,所以非常自然简单。配置信息可以通过命令行或者使用API来传送给verticle(Vert.x的部署单元,类似Servlet)。
不再是8080端口
第一步是修改io.vertx.blog.first.MyFirstVerticle
类,使其不再绑定8080端口,而是从配置来获取目标端口号:
public void start(Future fut) {
vertx
.createHttpServer()
.requestHandler(r -> {
r.response().end("Hello from my first " +
"Vert.x 3 application
");
})
.listen(
// Retrieve the port from the configuration,
// default to 8080.
config().getInteger("http.port", 8080),
result -> {
if (result.succeeded()) {
fut.complete();
} else {
fut.fail(result.cause());
}
}
);
}
所以,这里和上一个版本唯一区别就是config().getInteger("http.port", 8080)
。这里,我们的代码现在获取配置信息并检查http.port属性是否存在,如果不存在,则使用8080端口号作为备选项。获取的配置信息是一个JsonObject
类型的对象。
由于我们默认使用8080端口号,你还是能如之前一样打包我们的应用并执行它:
mvn clean package
java -jar target/my-first-vertx-app-0.0.1-SNAPSHOT-fat.jar
很简单,不是吗?
基于API的配置-为测试而使用随机端口
现在应用是可配置的,我们来提供一个配置。在我们的测试中,我们打算配置我们的应用使用8081端口。之前我们用如下命令来部署我们的verticle:
vertx.deployVerticle(MyFirstVerticle.class.getName(), context.asyncAssertSuccess());
我们来传递一些部署项:
port = 8081;
DeploymentOptions options = new DeploymentOptions()
.setConfig(new JsonObject().put("http.port", port)
);
vertx.deployVerticle(MyFirstVerticle.class.getName(), options, context.asyncAssertSuccess());
DeploymentOptions
对象让我们定制部分参数,特别是,它让我们注入verticle使用config()
方法获取的JsonObject
对象。
显然,连接到服务器的测试需要做细微调整来使用正确的端口(port
是一个字段):
vertx.createHttpClient().getNow(port, "localhost", "/", response -> {
response.handler(body -> {
context.assertTrue(body.toString().contains("Hello"));
async.complete();
});
});
很好,但这也没有真正解决我们的问题。当8081端口也被使用时会发生什么。现在我们挑选一个随机端口:
ServerSocket socket = new ServerSocket(0);
port = socket.getLocalPort();
socket.close();
DeploymentOptions options = new DeploymentOptions()
.setConfig(new JsonObject().put("http.port", port)
);
vertx.deployVerticle(MyFirstVerticle.class.getName(), options, context.asyncAssertSuccess());
所以,这想法很简单。我们打开一个server socket,这个server socket将挑选一个随机端口(这就是为什么我们输入0作为参数)。我们获取被占用的端口号后关闭套接字。需要注意的是,这个方法并不完美。如果被挑选的端口在close
方法和启动HTTP服务器之间被占用的话,这个测试会失败。然而,在绝大多数情况下,这个方法都会工作良好。
这个方法到位后,我们的测试现在使用一个随机端口号。用如下命令执行测试:
mvn clean test
外部配置-我们在另一个端口上运行应用
在生产环境我们不希望有随机端口。如果你告诉你的生产团队你的应用挑选一个随机端口你可以想象到他们的反应。我们不能和生产团队搞砸关系。
所以,如果真要执行你的应用,我们通过一个外部配置文件传递配置信息。该配置保存在一个json文件中。
新建一个src/main/conf/my-application-conf.json
文件,内容如下:
{
"http.port" : 8082
}
现在,为了使用这个配置信息,你只需要用如下命令来启动应用:
java -jar target/my-first-vertx-app-0.0.1-SNAPSHOT-fat.jar -conf src/main/conf/my-application-conf.json
打开浏览器,访问http://localhost:8082,ok
这是如何实现的?记住,我们的fat jar使用Starter
类(Vert.x提供)来加载我们的应用。这个类读取-conf
参数,当部署我们的verticle时会创建相对应的部署项。
结论
在开发了第一个Vert.x应用后,我们学习了如何让这个应用可配置,并且可配置并没有给我们的应用增加复杂度。下一篇贴子,我们将学习用vertx-web来开发一个能提供静态页面和一个REST API的小应用。更有趣,但还是很简单。
编码快乐 并 敬请期待