第一個Vert.x 3應用程序

原文: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

環境

  1. JDK 8

  2. Maven

開始

  1. 在你喜歡的地方,創建一個目錄,vertxStart

  2. 創建 src/main/java 目錄

  3. 創建 src/test/java 目錄

  4. 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

編譯結果如下圖所示:


測試

完成了應用的開發工作是很好的,但是我們可能並沒有那麼細心,所以需要對它進行測試。這個測試,使用了junitvertx-unitvertx-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方法。這個方法向我們的應用程序發出一個請求並且檢查結果。發出請求和接收回復是異步。所以,我們需要一個能夠控制異步的方式。就像,setUptearDown方法,這個測方法接收一個TestContext參數。在這個對象中,我們創建了一個異步處理對象async,當測試完成的時候,使用async.complete()幫我們通知測試框架。

所以,一旦async handle被創建了,我們就創建了一個HTTP的客戶端並且提交了一個HTTP請求,由我們的應用程序通過調用getNow()getNowget(...).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

校對:子期

轉載請註明出處


歡迎關注我們的公衆號:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章