Vert.x 導(dǎo)論之二:Vert.x 3 應(yīng)用配置

’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)用业扒。更有趣检吆,但還是很簡單。

編碼快樂 并 敬請期待

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末程储,一起剝皮案震驚了整個濱河市蹭沛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌章鲤,老刑警劉巖摊灭,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異败徊,居然都是意外死亡帚呼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門皱蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煤杀,“玉大人,你說我怎么就攤上這事沪哺∩蜃裕” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵凤粗,是天一觀的道長酥泛。 經(jīng)常有香客問我今豆,道長,這世上最難降的妖魔是什么柔袁? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任呆躲,我火速辦了婚禮,結(jié)果婚禮上捶索,老公的妹妹穿的比我還像新娘插掂。我一直安慰自己,他們只是感情好腥例,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布辅甥。 她就那樣靜靜地躺著,像睡著了一般燎竖。 火紅的嫁衣襯著肌膚如雪璃弄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天构回,我揣著相機(jī)與錄音夏块,去河邊找鬼。 笑死纤掸,一個胖子當(dāng)著我的面吹牛脐供,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播借跪,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼政己,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掏愁?” 一聲冷哼從身側(cè)響起歇由,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎托猩,沒想到半個月后印蓖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡京腥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年赦肃,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片公浪。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡他宛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出欠气,到底是詐尸還是另有隱情厅各,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布预柒,位于F島的核電站队塘,受9級特大地震影響袁梗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憔古,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一遮怜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸿市,春花似錦锯梁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至内舟,卻和暖如春合敦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谒获。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工蛤肌, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留壁却,地道東北人批狱。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像展东,于是被迫代替她去往敵國和親赔硫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容