1. 程式人生 > >Vert.x (二): 我的第一個Vert.x 3 應用

Vert.x (二): 我的第一個Vert.x 3 應用

如果,你聽到有人說Vert.x 是牛逼的。非常好!但是你自己想要嘗試的話,Ok great,那麼下一個問題自然是“從哪裡開始?”,這篇文章是一個很好的起點。文章展示了怎麼構建一個非常簡單的 vert.x 應用(這沒什麼大不了的),怎樣測試和執行vert.x應用。

文章裡提到的程式碼在github

開始

首先,建立一個專案,在這篇文章中使用Apache Maven,當然你可以使用Gradle 或者其他工具,使用Maven jar archetype

建立結構,但基本上只需要一個目錄。

  • 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>name.quanke.study.vertx.first</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).

第二點非常重要,Vert.x 只支援Java 8

編碼!

OK,我們已經建立了一個pom.xml 檔案,接下來正式開始編碼,建立 src/main/java/name/quanke/study/vertx/first/MyFirstVerticle.java檔案,內容如下:

package name.quanke.study.vertx.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(result.cause());
}
});
}
}

這個實際上不是最優秀的應用,這個類繼承AbstractVerticle,在Vert.x的世界裡verticle就是元件,通過繼承AbstractVerticle類,獲得vertx的入口。

verticle部署後會呼叫start方法,我們也能實現 stop 方法,在這個方法裡回收資源,start方法接收Future物件的引數,可以告訴使用者是執行完成還是報出錯誤,Vert.x是非同步執行的,執行的時候不會等到start方法執行完成,所以 Future 引數是非常重要的,可以通知是否已經執行完成。

start方法裡建立了一個HTTP 服務和一個請求處理器(handler),這個請求處理器使用lambda表示式,通過requestHandler方法,每次伺服器收到請求,都會返回“Hello。。。”(也沒有什麼其他可以告訴你的東西了。。。),最後伺服器綁定了一個8080埠,這裡可能會失敗(因為8080埠可能被使用了),通過lambda表示式檢查是否連線成功,就想上面說的,呼叫fut.complete表示成功,呼叫 fut.fail 報告失敗。

使用下面的命令嘗試著編譯應用(首先你要安裝好了maven,此命令在pom.xml目錄下執行,知道使用maven的都懂得):

mvn clean compile

如果幸運,編譯應該是成功的。

應用就編寫到這裡,是不是很簡單?

測試

應用開發完成了,但是我們從來都不是很認真的,所有我們需要測試一下,測試使用JUnitvertx-unit

開啟pom.xml檔案,增加兩個依賴(dependencies):

<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/main/java/name/quanke/study/vertx/first/MyFirstVerticleTest.java 檔案

package name.quanke.study.vertx.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(<span class="hljs-number">8080</span>, <span class="hljs-string">"localhost"</span>, <span class="hljs-string">"/"</span>,
 response -&gt; {
  response.handler(body -&gt; {
    context.assertTrue(body.toString().contains(<span class="hljs-string">"Hello"</span>));
    async.complete();
  });
});

}
}

在這裡使用JUnit測試verticle,也會使用到 vertx-unit 自定義的runnervert.x-unit很容易測試非同步的vert.x應用。

setUp方法裡,建立了一個Vertx例項,deployverticle ,你可能已經注意到了,這與傳統JUnit@Before不一樣,它接收了一個TestContext引數,TestContext物件讓我們可以控制非同步的測試,例如:當我們deploy了非同步verticle,多個Vertx例項相互作用時,不能檢測它的正確性,deployVerticle方法的第二個引數返回一個handler:context.asyncAssertSuccess(),如果verticle的狀態是失敗,那這個測試就是失敗的,此外會等待verticle完成啟動,還記得,在verticle裡,我們呼叫了fut.complete()方法,直到等到呼叫fut.complete()方法才返回狀態。

tearDown方法比較簡單,負責回收我們建立的vertx物件。

現在我們看一下測試應用的testMyApplication方法,給應用發出請求並且攔截一個返回,發出請求和接收答覆都是非同步的,我們需要一種方法來控制,setUptearDown方法接收一個TestContext物件,當這個測試完成的時候,通過我們這個物件建立的非同步的處理器(async),通知測試框架(使用async.complete()

像這樣,一個非同步處理器建立好了,我們使用getNow()方法(getNow()方法是get(...).end()的捷徑),建立一個HTTP客戶端和發一個HTTP請求給我們的應用,響應使用lambda處理,通過另一個lambdahandler方法接收一個response body,這個body引數是這個response body(如buffer物件),檢測body是否等於“Hello”字串,並且宣佈測試完成(async.complete())。

讓我們花一個分鐘的時間提一下這個斷言,不像傳統的使用context.assert...斷言,如果斷言失敗,它會立即中斷測試,因為Vert.x 程式各方面都是非同步的,所以使用這種方式斷言測試很重要。

可以使用IDE或者Maven執行測試:

mvn clean 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>name.quanke.study.vertx.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類,實際上,它是在vertx例項化和部署verticle的時候就有建立。

這個外掛的配置就是這樣,我們執行:

mvn clean package

應該會建立一個target/my-first-app-1.0-SNAPSHOT-fat.jar,裡面嵌入了應用所有的依賴(包含vert.x自己)。

執行

嗯,很高興擁有一個 fal 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 上任意建立令人驚奇的系統。接下來的時間看看怎麼配置我們的應用。

Happy coding & Stay tuned !

全科龍婷▼升職加薪

image
      </div>
    </div>