Vert.x介绍

1 Vert.x不是一个框架,而是一个工具包

Vert.x是基于Netty项目——一个基于JVM的高性能异步网络库,它的核心库定义了编写异步网络应用的基本API,你可以为应用程序选择有用的模块(如数据库链接、监控、认证、日志、服务发现、集群支持等),同时它也可以内嵌到现有的应用中(如springboot项目中)既能体验Vert.x的高效又兼顾spring的泛用性

vertx并不是针对特定应用的框架,它其实很大程度上就是netty的一个最佳实践的封装。在java上实现了类似于node.js的异步处理框架。

2 Vert.x是多语言的

Vert.x运行在Java虚拟机上,支持多种编程语言,Vert.x是高度模块化的,同一个应用,你可以选择多种编程语言同时开发。它支持广泛的流行的JVM语言:Java、Groovy、Scala、Kotlin、JavaScript、Ruby及Ceylon。

3 完善的生态体系

与我们熟悉的spring类似,Vert.x拥有完善的生态,使用vert.x可以完成一个应用的所有开发工作,可以实现一个完全异步处理的应用。它拥有类似于spring全家桶的生态体系,具体如下:

image

3.1 核心模块:Vert.x-core

Vert.x核心模块包含一些基础的功能,如HTTP,TCP,文件系统访问,EventBus、WebSocket、延时与重复执行、缓存等其他基础的功能,你可以在你自己的应用程序中直接使用。可以通过vertx-core模块引用即可。

3.2 支持web开发:Vert.x-Web

Vert.x Core 提供了一系列底层的功能用于操作 HTTP,对于一部分应用来是足够的。
Vert.x Web 基于 Vert.x Core,提供了一系列更丰富的功能以便更容易地开发实际的 Web 应用。

3.3 Vert.x提供多种数据访问的Api封装

Vert.x提供了对关系型数据库、NoSQL、消息中间件的支持,传统的客户端因为是阻塞的,会严重影响系统的性能,因此Vert.x提供了对以上客户端的异步支持。具体支持的数据访问如下:

  • MongoDB client
  • JDBC client
  • SQL common
  • Redis client
  • MySQL/PostgreSQLclient

3.5 微服务的支持:服务发现、熔断器

  • Vert.x Service Discovery:一个服务发现的基础组件,用来发布和发现各种类型的资源
  • Vert.x Circuit Breaker:是熔断器模式的Vert.x实现。可与springcloud种的Hystrix对比
  • Vert.x Config:提供了一种配置 Vert.x 应用的方式。

3.6 Vert.x整合了常用的消息驱动:Vert.x Integration

  • Vert.x Mail Client:提供了一简单STMP邮件客户端,所以你可以在应用程序中发送电子邮件
  • Vert.x STOMP Client & Server:提供了STOMP协议的实现包括客户端与服务端。
  • Vert.x JCA Adaptor:提供了Java连接器架构适配器,这允许同任意JavaEE应用服务器进行互操作。
  • Vert.x RabbitMQ Client:消息队里的客户端支持
  • Vert.x Kafka Client:消息队里的客户端支持
  • Vert.x Consul Client:google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案。

3.7 身份验证和授权:

Vert.x提供了简单API用于在应用中提供认证和授权。

  • Auth common:通用的认证API,可以通过重写AuthProvider类来实现自己的认证
  • JDBC auth: 后台为JDBC的认证实现
  • JWT auth: 用JSON Web tokens认证实现
  • Shiro auth: 使用Apache Shiro认证实现
  • MongoDB auth: MongoDB认证实现
  • OAuth 2: Oauth2协义认证实现
  • htdigest auth: 这个是新增一种认证的支持

5 Vert.x、lambda、JDK8

Vert.x异步也带来了编码上的复杂性,想要编写优美的异步代码,就需要对lambda表达式、函数式编程、Reactive等技术非常熟悉才行,否则很容易导致你的代码一团糟,完全没有可读性。
在JDK8中引入了lambda表达式后,使用Java开发Vert.x应用就变得十分顺畅。

6 Vert.x核心概念

  • Verticle
    • Vert.x中的部署单元称为Verticle。Verticle是Vert.x中的一个核心概念。如果说Vertx是“应用”,那么Verticle就是应用中的一个服务。另一个更形象一点的比喻,如果说Vertx是一个机架,那么Veticle就是机架上的服务器。Verticle可以被传递一些配置信息(如证书、网络地址等),而且Verticle可以被多次部署,Verticle可以部署其它Verticle
    • verticle分两种,一种是基于EventLoop的适合I/O密集型的,还有一种是适合CPU密集型的worker verticle
  • EvenLoop
    • 事件循环(EventLoop)是异步编程模型中是特有的,一个Verticle通过一个事件循环(EventLoop)处理接收到的事件,这些事件可以是任何事情,如接收网络缓冲、调度事件或由其它Verticle发送的消息,事件循环(EventLoop)中执行时,不能进行线程阻塞操作

  • EvenBus
    • 事件总线(EvenBus)是在不同Verticle之间通过异步消息传递进行通讯的主要工具

其他介绍

Vert.x 的定义是 “用来在JVM上构建反应式(reactive)应用程序的工具箱”。

Vert.x并不是一个应用服务器,一个容器或者一个框架。 它也并不是一个JavaScript开发库。Vert.x是一个朴素的老的 jar文件,所以一个Vert.x应用程序实际上是一个使用这个 jar 文件的程序。 Vert.x并不强制一个打包的方式。所有Vert.x 模块(components) 都是朴素 平淡 的 jar 文件。 这将怎样影响你的应用程序呢?让我们想象你在使用一个项目构建工具,比方说Maven或者Gradle, 去建立你的应用,一个 Vert.x 应用程序,其实就是吧 vertx-core 加入到依赖项里。 你想使用其他的 Vert.x 组件吗?请把它+到你的依赖项里。这很简单,毫无负担,不是吗。 启动这个程序就是启动一个简单实现了 public static void main(String[] args) 的类。我们不需要任何特殊的IDE或者插件去安装和开始使用 Vert.x。

反应式、响应式编程、响应式系统

Vert.x 是 反应式 。它就是要用来建立反应式应用程序,或者更贴切的说法是反应式系统

再次,Vert.x 是一个事件驱动和非阻塞的。事件被投递到一个永不阻塞的事件循环(EventLoop) 里。Vert.x只使用非常少的线程。 有一些线程是事件循环, 它们在处理器(Handlers) 之间派发事件。如果你把某个线程阻塞了,事件将不能继续派发。这个执行模式将影响你如何写代码,不同于传统的阻塞代码,你的代码将是异步的和非阻塞的。

举一个例子,如果你要得到一个基于URL的资源,你需要这么做:

1
2
3
4
5
6
7
8
URL site = new URL("http://vertx.io/");
BufferedReader in = new BufferedReader(new InputStreamReader(site.openStream()));

String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
in.close();

但是用 Vert.x 的话,就很简单:

1
2
3
vertx.createHttpClient().getNow(80, "vertx.io", "", response -> {
response.bodyHandler(System.out::println);
});

对于异步编程的理解,比如ajax与Vert.x

1
2
3
4
5
6
7
8
9
10
11
12
13
//ajax代码
console.log("1");

$.ajax({
"url" : "/hello",
"type" : "post",
"dataType" : "json",
"success" : function(val) {
console.log("2");
}
});

console.log("3");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//vert.x代码
System.out.println("1")

WebClient
.create(vertx)
.postAbs(REQUEST_URL) // 这里指定的是请求的地址
.sendBuffer(buffer, res -> { // buffer是请求的数据

if (res.succeeded()) {
// 请求远程服务成功
System.out.println("2")

} else {
// 请求失败
resultHandler.handle(Future.failedFuture("请求服务器失败..."));
}
});

System.out.println("3")

学习资料

Vert.x 官方文档中文翻译

A gentle guide to asynchronous programming with Eclipse Vert.x for Java developers中文翻译版

Vert.x CSDN教程专栏

Vert.x 蓝图 - Micro-Shop 微服务实战

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