Vertx 初探
Vertx 是一个Java 异步编程的工具框架,使用Vertx 编写异步的,高性能与低内存占用的项目。
2014年发布,经历 2.0 版本,3.0版本发布才全球火爆,国外技术圈中比较出名,国内主要是Spring的天下,相对较少。
但是Spring6 版本出来后,惊奇的发现Spring的技术栈逐步也切换到异步高性能模式(基于Spring project reactor项目实现),可以说与Vertx 异曲同工,所以掌握Vertx 对于了解Java 技术趋势多有裨益。
走起
创建Maven项目,增加对Vertx 的依赖
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-core</artifactId>
<version>4.5.8</version>
</dependency>
这里要提到Vertx 的版本信息,这就要说Vertx 是Redhat 赞助,平均3个月一个版本,大版本之间有部分兼容问题,大版本内容兼容性好,
当前 4.5.8 ,Vertx5.0 版本会在 2024年9月发布,4到5 的迁移难度不达,都是依赖Netty 4,不会迁移到Netty5 。评估的理由是Netty5 目前变化太大,不利于Vertx 的兼容性。所以放心食用,呵呵。
最简单的使用,用Vertx 创建一个HTTP Server
package org.example;
import io.vertx.core.Handler;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServerRequest;
public class Main {
private static void requestHandler(HttpServerRequest request){
request.response().end("hello world");
}
public static void main(String[] args) {
// 声明一个单例的Vertx Instance ,
// 所以如果的集群的Vertx,就需要Vertx.cluster(ClusterConfig)
Vertx vertx = Vertx.vertx();
vertx.createHttpServer().requestHandler(Main::requestHandler).listen(8080,"0.0.0.0", httpServerAsyncResult -> {
if(httpServerAsyncResult.succeeded()){
System.out.println("Http Server Listen on 8080");
}else {
System.out.println("Http Server Listen on 8080");
}
});
}
}
品位一下 这种代码编写风格,异步,流式的代码写法。
运行起来测试一下
个人比较替换Jmeter
上面使用的Vertx-core 包实现,在Core 包中增加对Http TCP UDP 等多种网络协议的支持,如果开发Web 应用,增加Web 包的支持
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-web</artifactId>
<version>4.5.8</version>
</dependency>
有了Web 包,就可以将requesterHandler 更换成Router 对象
就可以像Spring Web 一样,指定请求路径对应的处理逻辑
public interface Router extends Handler<HttpServerRequest> {
}
所以增加Router 后的代码
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
router
.get("/user")
.handler(
rc -> {
JsonArray jsonArray = new JsonArray();
jsonArray.add(JsonObject.of("user_name", "peter"));
jsonArray.add(JsonObject.of("user_name", "tom"));
jsonArray.add(JsonObject.of("user_name", "jerry"));
rc.response().end(jsonArray.encode());
});
vertx
.createHttpServer()
.requestHandler(router)
.listen(
8080,
"0.0.0.0",
httpServerAsyncResult -> {
if (httpServerAsyncResult.succeeded()) {
System.out.println("Http Server Listen on 8080");
} else {
System.out.println("Http Server Listen on 8080");
}
});
请求结果
以上就是Vertx 初探。
Vertx 与 RxJava
首先Vertx 的代码风格,非常适合使用RxJava,那么Rxjava 又是一个什么?RxJava 在Android 开发中常见,
也是一种实现的Reactor 模式的Java 编程实现,不同编程语言实现Reactor 模式的库包都类似,如Rx.Net,RxJS...
优点:
统一的编程范式,如 创建型 ,聚合型,监听型
API非常精炼和统一
支持被压机制
流式、函数式编程风格
缺点:
函数式编程通病,不方便调试,理解后就可以正常调试
可读性没有过程型的编程风格好,
Vertx 中使用Rxjava
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-rx-java3</artifactId>
<version>4.5.8</version>
</dependency>
代码编写如下
package org.example;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.rxjava3.core.Vertx;
import io.vertx.rxjava3.ext.web.Router;
public class Main {
public static void main(String[] args) {
// 使用Rxjava 后 Vertx Instance,Router 都要使用RxJava包装的类
Vertx vertx = Vertx.vertx();
Router router = Router.router(vertx);
router
.get("/user")
.handler(
rc -> {
JsonArray jsonArray = new JsonArray();
jsonArray.add(JsonObject.of("user_name", "peter"));
jsonArray.add(JsonObject.of("user_name", "tom"));
jsonArray.add(JsonObject.of("user_name", "jerry"));
rc.response().end(jsonArray.encode());
});
vertx
.createHttpServer()
.requestHandler(router)
.rxListen(8080, "0.0.0.0")
// 注意Rx 本身是惰性的,如果没有subscribe的情况,不会执行任何逻辑
.subscribe(
server -> {
System.out.println("Http Server Success Listen on 8080");
},
err -> {
System.out.println("Http Server Failed to Listen on 8080");
});
}
}
其中rxListen 就会返回一个Rx实例,遵循Rx代码风格(异步监听者设计模式),必须要有“听众” ,否则惰性的Rx 什么都不会执行
Vertx 与 Spring 6
先说Vertx 与Spring,在Spring6 之前,Spring的代码风格是同步,Spring的IOC容器实现依赖注入,
两者是可以融合的,
[Vertx+Spring](https://github.com/snowdrop/vertx-spring-boot)
那么Spring6 又是什么。
Spring6 也是在Netty 基础上,并全面转向异步编程
所以我认为Vertx 在技术方向上是领先的。