Java Vertx 全解析

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
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-web Jmeter请求
以上就是Vertx 初探。

Vertx 与 RxJava

首先Vertx 的代码风格,非常适合使用RxJava,那么Rxjava 又是一个什么?RxJava 在Android 开发中常见,
也是一种实现的Reactor 模式的Java 编程实现,不同编程语言实现Reactor 模式的库包都类似,如Rx.Net,RxJS...

ReactiveX 官网

优点:

统一的编程范式,如 创建型 ,聚合型,监听型
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 基础上,并全面转向异步编程
Spring6加强对响应式编程的支持
所以我认为Vertx 在技术方向上是领先的。

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值