Vert.x创建一个Http服务

本文是我在学习Vert.x过程中的一些笔记,作为记录。
因为是初学,对Vert.x的理解还不够透彻,如有错误之处我们可以在评论中一起讨论呦。

环境准备

  • JDK8+
  • Maven
  • IDE
  • Vert.x 3.6.3

本文将会建立一个基本的HTTP服务器,并监听指定端口,任何发往该服务器以及端口的请求,服务器会返回一个字符串。

该项目使用Maven构建,当然也可以选择Gradle(参考vertx.io

pom.xml文件

pom.xml中加入相关的依赖和插件,如下所示:
注:此处需要注意Vert.x的版本,以及main.class属性的值是对应着Verticle类的路径,maven打包后启动时会以次类为启动类。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?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>com.zhengql</groupId>
<artifactId>vertx</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
</modules>
<name>vertx</name>
<description>Demo project for vertx</description>

<properties>
<vertx.version>3.6.3</vertx.version>
<main.class>com.zhengql.vertx.Main</main.class>
</properties>

<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${vertx.version}</version>
</dependency>

<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-unit</artifactId>
<version>${vertx.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</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>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</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>${main.class}</Main-Class>
</manifestEntries>
</transformer>

<!--多语言支持在打包时需加入以下转换器-->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
</transformer>

</transformers>
<artifactSet />
<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-prod.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

创建MyFirstVerticle类和Main类

MyFirstVerticle.java,继承AbstractVerticle类,创建一个http服务端并监听指定端口,异步处理该端口的请求。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zhengql.vertx;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServer;

/**
* 描述:Verticle类,创建一个http服务端,监听10802端口,当有请求进来时返回结果
*
* @author zhengql
* @date 2019/3/13 10:25
*/
public class MyFirstVerticle extends AbstractVerticle {
@Override
public void start() throws Exception {
vertx.createHttpServer().requestHandler(req->{
req.response().end("bababababalalallala");
}).listen(10802);
}

Main.java代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.zhengql.vertx;


import io.vertx.core.Vertx;

public class Main {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
vertx.deployVerticle(MyFirstVerticle.class.getName(),r->{
if (r.succeeded()){
System.out.println("http server start succeeded.....");
}else {
System.out.println("http server start error.....");
}
});
}
}

启动Vert.x应用

在IDE中启动,直接运行Main文件中的main方法,部署verticle,若启动成功,控制台中会打印http server start succeeded.....

在浏览器中请求 http://localhost:10802/ ,可以看到我们刚才创建的httpserver对发出的请求监听成功并作出了响应:

当然,我们也可以通过打包的方式来部署,使用Maven的mvn package命令打包,随后在src的同级目录下会出现target目录会生成jar包,java -jar vertx 0.0.1-SNAPSHOT-prod.jar执行,控制台中同样会打印http server start succeeded.....,浏览器中请求 http://localhost:10802/,可以看到我们编写的请求响应。

通过jar包执行部署,是因为我们在pom中指定了程序的主类,也就是启动入口为Main.java,当我们java -jar的时候就启动了Main.java类,等同于在IDE中启动。

Launcher启动

另一种启动方式,也是官方推荐的启动方式
在pom.xml中加入main.verticle属性,并将该属性值设置为maven-shade-plugin插件的manifestEntries的Main-Verticle对应的值,最后修改main.class为io.vertx.core.Launcher,修改后的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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
<?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>com.zhengql</groupId>
<artifactId>vertx</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
</modules>
<name>vertx</name>
<description>Demo project for vertx</description>

<properties>
<vertx.version>3.6.3</vertx.version>
<!--此处修改-->
<main.class>io.vertx.core.Launcher</main.class>
<!--此处修改-->
<main.verticle>com.zhengql.vertx.MainVerticle</main.verticle>
</properties>

<dependencies>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>${vertx.version}</version>
</dependency>

<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-unit</artifactId>
<version>${vertx.version}</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</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>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.2</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>${main.class}</Main-Class>
<!--此处修改--> <Main-Verticle>${main.verticle}</Main-Verticle>
</manifestEntries>
</transformer>

<!--多语言支持在打包时需加入以下转换器-->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
</transformer>

</transformers>
<artifactSet />
<outputFile>${project.build.directory}/${project.artifactId}-${project.version}-prod.jar</outputFile>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>

至此,我们还缺少main-verticle属性中的MainVerticle.java,创建该类,代码如下:

1
2
3
4
5
6
7
8
9
10
package com.zhengql.vertx;

import io.vertx.core.AbstractVerticle;

public class MainVerticle extends AbstractVerticle {
@Override
public void start() {
vertx.deployVerticle(MyFirstVerticle.class.getName());
}
}

然后重新打包后执行,控制台中同样会打印http server start succeeded.....,浏览器中请求 http://localhost:10802/ ,可以看到我们编写的请求响应。

总结

如此,便创建一个http服务端,是不是很方便呢,首先最大的感觉就是Vert.x应用他的启动没有依赖任何容器,直接启动,完全是运行在jvm上,没有像springmvc那样,需要依靠tomcat或者其他容器,而且vertx是异步编程,HTTP服务端创建逻辑,就是一个观察者模式,创建http服务端,异步处理该端口中的请求。

---------- 😏本文结束  感谢您的阅读😏 ----------
评论