Vert.x 导论之二:Vert.x 3 应用配置

’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<Void> fut) {
  vertx
      .createHttpServer()
      .requestHandler(r -> {
        r.response().end("<h1>Hello from my first " +
            "Vert.x 3 application</h1>");
      })
      .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的小应用。更有趣,但还是很简单。

编码快乐 并 敬请期待

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容