’Vert.x導(dǎo)論‘回顧
在Vert.x 導(dǎo)論之一:第一個Vert.x 3 應(yīng)用中,我們開發(fā)了一個很簡單的Vert.x 3應(yīng)用泼橘,并測試胡桨,打包執(zhí)行了這個應(yīng)用履植。然而這只是個開始,在這個貼子中陪汽,我們將支持外部配置來加強我們的應(yīng)用训唱。
我們的應(yīng)用在8080端口上啟動了一個HTTP服務(wù)器,對所有HTTP請求返回"Hello"消息挚冤。之前的代碼可以在這里找到雪情。這篇帖子中的代碼在這里。
為什么我們需要配置
這是個好問題你辣。應(yīng)用現(xiàn)在工作了巡通,但是如果你想要把它部署在一臺8080端口已經(jīng)被占用的機(jī)器上的話。我們就需要勞民傷財?shù)男薷脑趹?yīng)用代碼和測試代碼中的端口號舍哄。這令人氣餒宴凉。所幸Vert.x應(yīng)用是可以配置的。
Vert.x配置使用JSON格式表悬,所以非常自然簡單弥锄。配置信息可以通過命令行或者使用API來傳送給verticle(Vert.x的部署單元,類似Servlet)。
不再是8080端口
第一步是修改io.vertx.blog.first.MyFirstVerticle
類籽暇,使其不再綁定8080端口温治,而是從配置來獲取目標(biāo)端口號:
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());
}
}
);
}
所以,這里和上一個版本唯一區(qū)別就是config().getInteger("http.port", 8080)
戒悠。這里熬荆,我們的代碼現(xiàn)在獲取配置信息并檢查http.port屬性是否存在,如果不存在绸狐,則使用8080端口號作為備選項卤恳。獲取的配置信息是一個JsonObject
類型的對象。
由于我們默認(rèn)使用8080端口號寒矿,你還是能如之前一樣打包我們的應(yīng)用并執(zhí)行它:
mvn clean package
java -jar target/my-first-vertx-app-0.0.1-SNAPSHOT-fat.jar
很簡單突琳,不是嗎?
基于API的配置-為測試而使用隨機(jī)端口
現(xiàn)在應(yīng)用是可配置的符相,我們來提供一個配置拆融。在我們的測試中,我們打算配置我們的應(yīng)用使用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
對象讓我們定制部分參數(shù)镜豹,特別是,它讓我們注入verticle使用config()
方法獲取的JsonObject
對象孕索。
顯然逛艰,連接到服務(wù)器的測試需要做細(xì)微調(diào)整來使用正確的端口(port
是一個字段):
vertx.createHttpClient().getNow(port, "localhost", "/", response -> {
response.handler(body -> {
context.assertTrue(body.toString().contains("Hello"));
async.complete();
});
});
很好,但這也沒有真正解決我們的問題搞旭。當(dāng)8081端口也被使用時會發(fā)生什么∩⒉溃現(xiàn)在我們挑選一個隨機(jī)端口:
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將挑選一個隨機(jī)端口(這就是為什么我們輸入0作為參數(shù))。我們獲取被占用的端口號后關(guān)閉套接字翎嫡。需要注意的是欠动,這個方法并不完美。如果被挑選的端口在close
方法和啟動HTTP服務(wù)器之間被占用的話惑申,這個測試會失敗具伍。然而,在絕大多數(shù)情況下圈驼,這個方法都會工作良好人芽。
這個方法到位后,我們的測試現(xiàn)在使用一個隨機(jī)端口號绩脆。用如下命令執(zhí)行測試:
mvn clean test
外部配置-我們在另一個端口上運行應(yīng)用
在生產(chǎn)環(huán)境我們不希望有隨機(jī)端口萤厅。如果你告訴你的生產(chǎn)團(tuán)隊你的應(yīng)用挑選一個隨機(jī)端口你可以想象到他們的反應(yīng)橄抹。我們不能和生產(chǎn)團(tuán)隊搞砸關(guān)系。
所以惕味,如果真要執(zhí)行你的應(yīng)用楼誓,我們通過一個外部配置文件傳遞配置信息。該配置保存在一個json文件中名挥。
新建一個src/main/conf/my-application-conf.json
文件疟羹,內(nèi)容如下:
{
"http.port" : 8082
}
現(xiàn)在,為了使用這個配置信息躺同,你只需要用如下命令來啟動應(yīng)用:
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
這是如何實現(xiàn)的丸逸?記住蹋艺,我們的fat jar使用Starter
類(Vert.x提供)來加載我們的應(yīng)用。這個類讀取-conf
參數(shù)黄刚,當(dāng)部署我們的verticle時會創(chuàng)建相對應(yīng)的部署項捎谨。
結(jié)論
在開發(fā)了第一個Vert.x應(yīng)用后,我們學(xué)習(xí)了如何讓這個應(yīng)用可配置憔维,并且可配置并沒有給我們的應(yīng)用增加復(fù)雜度涛救。下一篇貼子,我們將學(xué)習(xí)用vertx-web來開發(fā)一個能提供靜態(tài)頁面和一個REST API的小應(yīng)用业扒。更有趣检吆,但還是很簡單。
編碼快樂 并 敬請期待