Vertx 是一个高性能的 Java 框架,其借鉴了 Node.js 中的一些思想,基于 Netty 提供的异步 IO,提供了相对简单的编程接口,通过事件总线功能可以方便的实施组件分离的架构,并内置了集群功能,并支持采用多种语言进行开发。 本系列教程使用 Vertx 构建一个简单的API服务。 感受 Vertx 的基本功能。
环境准备 本文的例程基于如下软件:
Java 1.8 Vertx 3.9.0 Intellij IDEA Community 2019 以上软件都是免费的。
新建项目 在 IDEA 中新建一个名为: vertx-todo-api 的简单 maven 项目,建好后打开项目中的 pom.xml 文件,添加相关依赖,在章节中我们需要:
vertx-core - Vertx 的核心模块 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 格式的数据。