第一个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

校对:子期

转载请注明出处


欢迎关注我们的公众号:



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值