本文是我在学习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;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服务端,异步处理该端口中的请求。