1. 程式人生 > >Vert.x(三):Vert.x 3應用的配置

Vert.x(三):Vert.x 3應用的配置

在上篇文章中,開發了一個簡單的Vert.x應用,介紹了怎麼測試,打包和執行,這僅僅是一個開始,在這篇文章中,我們通過配置來提高應用。

還記得,在上一個應用中有HTTP server,監聽8080埠,應答一個“Hello”的訊息,上篇文章的程式碼在這裡,本篇文章的程式碼在github

為什麼需要配置?

這個問題非常好。這個應用是正常工作的,但是如果當你部署在8080埠已經被佔領了的機器上,如果要部署在這個機器上,我們就需要到程式碼裡修改應用程式和測試裡的埠了,這不能忍受,很幸運的是Vert.x配置一下就可以了。

Vert.x使用的是JSON格式配置的,所以很簡單,可以使用API傳給verticle或者命令列,我們來看一看。

不使用 ‘8080’ 埠

第一步是修改name/quanke/study/vertx/first/MyFirstVerticle.java類,從配置裡讀取埠,而不8080繫結,預設是8080埠:

public void start(Future<Void> 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. //預設8080 config().getInteger("http.port", 8080), result -> { if (result.succeeded()) { fut.complete(); } else
{ fut.fail(result.cause()); } } ); }

與上一版本的區別僅僅是listen裡面的第一個引數8080換成config().getInteger("http.port", 8080)。這裡,我們的程式碼會請求這個配置並檢查http.port屬性是否配置了。如果沒有,將會預設使用8080埠。配置資訊是從JsonObject中返回的。

預設還是使用8080,所以打包執行和以前一樣:

mvn clean package
java -jar target/my-first-app-1.0-SNAPSHOT-fat.jar

使用API的方式配置 - 在測試中隨機生成埠號

在測試程式碼中,我們把埠修改成8081,部署(deploying)verticle的程式碼如下:

vertx.deployVerticle(MyFirstVerticle.class.getName(), context.asyncAssertSuccess());

傳入部署(deploying)選項:

port = 8081;
DeploymentOptions options = new DeploymentOptions()
    .setConfig(new JsonObject().put("http.port", port)
);
vertx.deployVerticle(MyFirstVerticle.class.getName(), options, context.asyncAssertSuccess());

post在全域性變數裡面宣告的private Integer port;

DeploymentOptions物件可以定義多個引數。將JsonObject注入到verticle的config()方法中。

連線伺服器的程式碼需要修改一下,埠要和測試裡面的一樣才行。

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獲取一個隨機的埠(這也是為什麼將0作為引數)。檢索如果埠被佔用就關閉socket。需要注意的是,這個方法並不完美,如果埠在socket.close()方法之後和HTTP伺服器啟動之前被佔用的話,會失敗。然而,這種情況如果被朋友的話,說明你非常幸運,所以大多數情況下都是沒有問題的。

測試一下:

mvn clean test

外部配置-在另一個埠執行

在生產環境中,隨機埠並不是我們想要的。所以,在實際執行應用的時候,我們需要將配置寫在一個外部的檔案裡。這個配置的檔案使用json格式。

建立src/main/conf/my-application-conf.json,內容如下:

{
  "http.port" : 8082
}

通過執行下面這句命令,在啟動應用的時候,載入配置檔案:

java -jar target/my-first-app-1.0-SNAPSHOT-fat.jar -conf src/main/conf/my-application-conf.json

開啟瀏覽器,然後訪問 http://localhost:8082

編輯JSON檔案,重新打包執行,埠就修改了,不需要修改原始碼。

這是怎麼工作的?fat jar是使用Starter類來載入應用程式。當部署verticle的時候,這個類會讀取-conf引數,相應的會建立一個DeploymentOptions物件。

總結

在第一個應用的基礎上,只增加了非常簡單的程式碼就完成了Vertx的配置工作。下篇文章我們一起來看看通過vertx-web開發一個提供靜態頁面和REST API的小應用,這個更加厲害,但是也是非常簡單。

Happy coding & Stay tuned !

本人英語比較爛,建議看原文

全科龍婷▼升職加薪

image
      </div>