原文:http://mp.weixin.qq.com/s?__biz=MzA4MjUwNzQ0NQ==&mid=401398470&idx=1&sn=eee317418fe93a59dd979dc7945114b9#rd
從今天開始我們逐步翻譯整理Vertx官網技術文檔,並做最佳實踐,Vertx技術初學者們可以參考這些文檔,大牛們請忽略。
由於英語水平有限,翻譯不足之處,煩請各位看官斧正。
代碼
源代碼 https://github.com/cescoffier/my-vertx-first-app
環境
-
JDK 8
-
Maven
開始
-
在你喜歡的地方,創建一個目錄,
vertxStart
-
創建
src/main/java
目錄 -
創建
src/test/java
目錄 -
pom.xml
文件
整個項目結構如下:
.
|---pom.xml
|---src
| |
| |---main
| | |___ java
| |
| |___test
| |___ java
創建 pom.xml
文件
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.vertx.blog</groupId>
<artifactId>my-first-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
這個
pom.xml
文件很清晰,包含了下面兩點內容
-
聲明瞭
vertx-core
依賴 -
配置
maven-compiler-plugin
使用Java 8
開始編寫代碼
創建
src/main/java/io/vertx/blog/first/MyFirstVerticle.java
文件。
操作如下圖
內容如下:
package io.vertx.blog.first;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
public class MyFirstVerticle extends AbstractVerticle {
@Override
public void start(Future<Void> fut) {
vertx
.createHttpServer()
.requestHandler( r -> {
r.response().end("<h1>Hello from my first Vert.x 3 application</h1>");
})
.listen(8080, result -> {
if (result.succeeded()) {
fut.complete();
} else {
fut.fail(fut.cause());
}
});
}
}
這個程序很簡單,這個類繼承了AbstractVerticle
。在Vert.x裏,一個verticle
就是一個組件。通過繼承AbstractVerticle
,我們的類就能夠獲取vertx
對象並使用了。
當要部署verticle
的時候,start
方法就會被調用。當然,我們也可以實現一個stop
方法,但是在這個例子中,並沒有實現這個方法,將由Vert.x來替我們進行垃圾回收。這個start
方法接受一個Future
對象,當我們start
方法完成了或者報告一個錯誤的時候,它會通知Vert.x。Vert.x一個特性就是異步/無阻塞,當我們部署verticle
的時候,它並不會等到這個start
方法完成才完成部署。因此,這個Future
參數對於通知Vert.x,start
方法完成是非常重要的。(小編注:這邊有點繞,因爲start
方法內含有異步回調,這些代碼不會馬上執行,而Vertx不會等待這些代碼的執行,它會一直往下走直到結束)
這個start
方法創建了一個HTTP服務器、接受一個請求並處理它。這個處理request請求的是一個lambda表達式,傳入一個requestHandler
方法,任何時刻,當這個服務器接受一個請求就會調用。這裏,我們會返回一個“hello...”的字符串。最後,這個服務器綁定了8080端口。這可能會失敗,因爲8080端口可能被佔用了。我們傳入了另外一個lambda表達式,來檢查這個鏈接是否成功了。就像前面提到的,當成功的時候,它會調用fut.complete
,失敗了就調用ful.fail
返回一個錯誤。
編譯
mvn clean compile
編譯結果如下圖所示:
測試
完成了應用的開發工作是很好的,但是我們可能並沒有那麼細心,所以需要對它進行測試。這個測試,使用了junit
和vertx-unit
。vertx-unit
是vert.x的一個組件,用來測試vert.x的應用程序將會更加的得心應手。
打開pom.xml
文件,然後加上下面兩個依賴。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-unit</artifactId>
<version>3.0.0</version>
<scope>test</scope>
</dependency>
接下來,創建測試類,src/test/java/io/vertx/blog/first/MyFirstVerticleTest.java,內容如下:
package io.vertx.blog.first;
import io.vertx.core.Vertx;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(VertxUnitRunner.class)
public class MyFirstVerticleTest {
private Vertx vertx;
@Before
public void setUp(TestContext context) {
vertx = Vertx.vertx();
vertx.deployVerticle(MyFirstVerticle.class.getName(),
context.asyncAssertSuccess());
}
@After
public void tearDown(TestContext context) {
vertx.close(context.asyncAssertSuccess());
}
@Test
public void testMyApplication(TestContext context) {
final Async async = context.async();
vertx.createHttpClient().getNow(8080, "localhost", "/",
response -> {
response.handler(body -> {
context.assertTrue(body.toString().contains("Hello"));
async.complete();
});
});
}
}
這是用來測試我們verticle
的Junit測試,它使用了vertx-unit,vert.x-unit會讓我們的異步測試變的更加容易,同時也是vert.x的基本組件之一。
在setUp
方法裏,我們創建了一個Vertx
的實例並且部署了verticle。你可能會注意到,@Before
方法與我們傳統的測試方法不一樣,它接收一個TestContext
參數。這個對象讓我們控制測試程序的異步部分。舉例來說,當我們部署verticle的時候,它啓動是異步的。在它正確啓動之前我們並不能檢查什麼。因此,deployVerticle
方法的第二個參數,我們傳入一個結果的處理者:context.asyncAssertSuccess()
。如果verticle沒有正確啓動,這個測試就失敗了。此外,它會等待直到vertical
完成。記住,在我們的verticle中,我們調用fut.complete()
。因此,它會等待直到這個方法被調用,而在調用失敗的情況下,測試也會失敗。
這個tearDown
方法就簡單了,僅僅是結束我們創建的這個vertx
實例。
現在讓我們來看看測試程序的這個testMyApplication
方法。這個方法向我們的應用程序發出一個請求並且檢查結果。發出請求和接收回復是異步。所以,我們需要一個能夠控制異步的方式。就像,setUp
和tearDown
方法,這個測方法接收一個TestContext
參數。在這個對象中,我們創建了一個異步處理對象async
,當測試完成的時候,使用async.complete()
幫我們通知測試框架。
所以,一旦async handle
被創建了,我們就創建了一個HTTP的客戶端並且提交了一個HTTP請求,由我們的應用程序通過調用getNow()
(getNow
是get(...).end()
的縮寫)方法來處理。這個Response是通過lambda表達式來處理的。在lambda表達式中,我們通過傳入另一個lambda表達式到handler
方法來取得響應。body
參數就是響應(作爲一個buffer對象)。我們檢查這個響應體包含了字符串"Hello"
然後聲明測試已經完成了。
現在讓我們再來看一下這個assertions。不像傳統的junit測試,它使用context.assert...
。實際上,當assertion失敗,將會立刻打斷這個測試。所以,使用這些assertion方法對測試Vert.x異步應用程序是非常重要的。
我們的測試可以在IED中運行,也可以使用maven:
mvn clean test
編寫test類後,開始測試。如圖:
打包
現在讓我們來總結一下。我們有一個應用程序和一個測試程序。現在我們需要來打包這個應用程序。在這篇文章中,我們將應用程序打包到一個fat.jar裏。fat.jar是一個單獨的可執行的Jar文件,包含了所有運行這個程序的依賴。把Vert.x應用程序打包成一個文件是很方便的,同時也容易執行。
爲了創建這個fat.jar,我們需要編輯pom.xml
文件,添加下面這個片段到</plugins>
之前。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>io.vertx.core.Starter</Main-Class>
<Main-Verticle>io.vertx.blog.first.MyFirstVerticle</Main-Verticle>
</manifestEntries>
</transformer>
</transformers>
<artifactSet/>
<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
這裏使用maven-shade-plugin插件來創建fat jar
。在manifestEntries
裏寫明瞭verticle的名字。你可能會奇怪Starter
類是怎麼來的。它實際上是vert.x的一個類,由它創建vertx
實例和部署我們的verticle
。
配置好插件,然我們開始運行:
mvn clean package
之後,將會創建target/my-first-app-1.0-SNAPSHOT-fat.jar
將所有的依賴都嵌入到了我們的程序之中(包括vert.x本身)。
執行我們的應用程序
現在,我們有了fat jar,但是我們想要看的我們的程序運行起來。前面說了,由於打包fat jar,運行一個vert.x將會很容易:
java -jar target/my-first-app-1.0-SNAPSHOT-fat.jar
執行成功後如下圖所示:
然後,打開瀏覽器訪問http://localhost:8080。
參考結果如下圖所示:
按Ctrl + c
停止。
總結
這個Vert.x 3速成教程,向你展現了怎麼使用Vert.x 3部署一個簡單的應用程序,還有如何測試、打包和運行。現在你已經知道了使用Vert.x 3構建一個非常棒的程序需要的所有基本步驟。
原文作者:Escoffier
翻譯+實踐:weiyiysw
校對:子期
轉載請註明出處
歡迎關注我們的公衆號: