Vert.x(三):Vert.x 3應用的配置
- 歡迎關注http://quanke.name/
- 交流群:
231419585
- 轉載請註明出處,謝謝
在上篇文章中,開發了一個簡單的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>