Vertx 构建Rest服务实验手册(一)

Vertx 是一个高性能的 Java 框架,其借鉴了 Node.js 中的一些思想,基于 Netty 提供的异步 IO,提供了相对简单的编程接口,通过事件总线功能可以方便的实施组件分离的架构,并内置了集群功能,并支持采用多种语言进行开发。 本系列教程使用 Vertx 构建一个简单的API服务。 感受 Vertx 的基本功能。

环境准备

本文的例程基于如下软件:

  1. Java 1.8
  2. Vertx 3.9.0
  3. Intellij IDEA Community 2019

以上软件都是免费的。

新建项目

在 IDEA 中新建一个名为: vertx-todo-api 的简单 maven 项目,建好后打开项目中的 pom.xml 文件,添加相关依赖,在章节中我们需要:

  1. vertx-core - Vertx 的核心模块
  2. vertx-web - Vertx 的 Web 扩展模块,实际上 vertx-core 中已经提供了对网络功能(包括 HTTP)的支持,但 vertx-web 模块使开发更容易。

修改后的 pom.xml 文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?xml version="1.0" encoding="UTF-8"?>
<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>org.example</groupId>
<artifactId>vertx-todo-api</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>3.9.0</version>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

</project>

添加 Verticle

对于 vertx 的应用,我们通常需要一个简单的 Java 类作为程序的入口。

在 src/main/java 中新建名为: cn.com.hohistar.study.vertx 的包,然后在包中新建名为: Main 的 Java 类。

然后再新建一个名为: cn.com.hohistar.study.vertx.verticle 的包,这个包用来存放例程中构建的 Verticle。 Verticle 是 vertx 中非常重要的一个概念,但现阶段你只需要理解它是 vertx 中的要给可部署单元。

在 verticle 包中新建名为 ApiVerticle 的类,通过这个类我们会部署一个 Web 服务。先看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class ApiVerticle extends AbstractVerticle {

private HttpServer server = null;

@Override
public void start(Future<Void> startFuture) throws Exception {

server = vertx.createHttpServer();

Router router = Router.router(vertx);

router.route("/ok").handler(ctx -> {
ctx.response().end("ok");
});

HttpServerOptions options = new HttpServerOptions();

server.requestHandler(router).listen(8080, result -> {

if (result.succeeded()) {

System.out.println("Todo Service startup in port: " + result.result().actualPort());

startFuture.succeeded();

} else {

result.cause().printStackTrace();

startFuture.failed();

}

});
}
}

在上面的代码中,自定义的 ApiVerticle 是继承于 AbstractVerticle 的, AbstractVerticle 是 Vertx 中预定义的一个类,其实现了 Verticle 基本的周期方法,start 方法就是当 Verticle 被部署到 Vertx 容器中时执行的方法。

在 start 方法中,使用了 vertx-web 中的 HttpServer 作为 Http 服务器。然后通过 Router 类定义了路由,也就是正对不同 URL 的处理逻辑。

然后通过 HttpServer 的 listen 启动 Http 服务,并在 8080 口进行监听。

启动 Verticle

现在在 Main 中添加代码,部署 ApiVerticle, 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main {

public static void main(String[] args) {

Vertx vertx = Vertx.vertx();

vertx.deployVerticle(ApiVerticle.class.getName(), res -> {

if (res.succeeded()) {
System.out.println("Todo service startup.");
} else {
System.out.println("Error: when startup Todo service");
res.cause().printStackTrace();
}
});
}
}

注意,在启动 HttpServer 监听和部署 ApiVerticle 时,使用的 api 都是采用传统的异步编程风格,也就是回调的方法,这是 vertx 编程中基本的风格

在方法调用中,因为时异步执行的,我们不能采用传统的返回值(return)的方式,而是通过在回调方法的参数的 succeeded 方法去判断调用是否成功。

完成上述代码后,就可以执行程序,并打开浏览器,访问本机的 8080, 就可以看到启动的结果了。

下一步

下一篇文章中,将介绍如何如何输出 Json 格式的数据。

本文标题:Vertx 构建Rest服务实验手册(一)

文章作者:梅老师

发布时间:2020年05月09日 - 17:05

最后更新:2020年09月16日 - 08:09

原始链接:https://www.mls-tech.info/java/vertx-practice-manual-1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。