目录
- vert.x是什么?
- 为什么使用Vert.x框架?
- 有哪些关键的特性和功能?
- 是如何做到高性能的?高性能机制详解
- 简单的开发事例
- 如何使用vert.x进行优雅的异步开发?
- 性能到底如何?
- 生态及发展展望
vert.x是什么?
- 由Tim Fox于2011年创立,现由Eclipse开源组织维护,已经迭代到v4.4.1
- 基于Netty开发,为开发人员提供了“一站式”的工程解决方案
- 是一个非常轻巧的、模块化的、灵活的的框架,内核的大小约为650kB
-
采用了事件驱动机制的异步编程框架,提供了面向事件编程的API,被称为最快的java框架
vertx.jpg
为什么使用Vert.x框架?
- 互联网业务一般都需具备高可伸缩性,而异步编程模型可以显著提高系统的伸缩性
- 传统的Spring Boot等框架对异步的支持不够友好,性能较差,在对性能有要求的场景并不适用,而Project Loom又迟迟不能用
- Vert.x相对于传统的Java框架,提供了非阻塞异步编程模型,具有高性能、响应式、可扩展等特性
Note: 1. 高性能:Vert.x采用非阻塞I/O和事件循环的模型,能够在单机上支持高并发,提高系统的整体性能和吞吐量。
- 响应式:Vert.x支持异步编程模型,能够处理大量请求并快速响应。同时,Vert.x的事件总线机制可以实时地处理不同组件间的消息传递和事件通知。
- 可扩展:Vert.x支持Verticle和Worker Verticle的概念,从而可以实现组件的复用和分布式部署,从而实现系统的可扩展性。
有哪些应用场景?
构建响应式系统</br>
Vert.x适用于构建响应式、高并发、实时数据处理的系统,例如物联网、实时数据分析、机器学习、行情分析等场景。构建网络应用程序</br>
Vert.x可以用于构建各种类型的网络应用程序,包括Web应用、RESTful服务、消息队列、实时通信、游戏服务器等。
有哪些关键的特性和功能?
Vert.x特性
- 多种编程语言支持,包括Java、Scala、JavaScript、Ruby、Python、Groovy、Clojure等
- 异步无锁编程:经典的多线程编程模型能满足很多Web开发场景,但随着移动互联网并发连接数的猛增,多线程并发控制模型性能难以扩展,同时要想控制好并发锁需要较高的技巧
- 各种IO支持:目前Vert.x的异步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;
- 分布式开发支持:Vert.x通过EventBus事件总线,可以轻松编写分布式解耦的程序,具有很好的扩展性;
- 生态体系成熟:当前已有包括Postgres、MySQL、MongoDB、Redis、Mq等常用组件
- 高效的编解码机制:能够高效的实现java对象与JSON、XML之间的相互转化,以前WEB访问的编解码
完善的生态体系
功能模块
<div id="left">
1. 核心模块:Vert.x-core </br>
Vert.x核心模块包含一些基础的功能,如HTTP,TCP,文件系统访问,EventBus、WebSocket、延时与重复执行、缓存等其他基础的功能,你可以在你自己的应用程序中直接使用。可以通过vertx-core模块引用即可。
2. web开发模块:Vert.x-Web
Vert.x Core 提供了一系列底层的功能用于操作 HTTP,对于一部分应用来是足够的。
Vert.x Web 基于 Vert.x Core,提供了一系列更丰富的功能以便更容易地开发实际的 Web 应用。
</div>
<div id='right'>
3. 多种数据库Api的封装库
Vert.x提供了对关系型数据库、NoSQL、消息中间件的支持,传统的客户端因为是阻塞的,会严重影响系统的性能,因此Vert.x提供了对以上客户端的异步支持。具体支持的数据访问如下:
- MongoDB client
- JDBC client
- SQL common
- Redis client
- MySQL/PostgreSQLclient
</div>
完善的生态体系
<div id='left'>
4. 微服务的支持
- Vert.x Service Discover:服务发现
- Vert.x Circuit Breaker:熔断器,与Hystrix类似
- Vert.x Config:应用配置
- Vert.x整合了常用的消息驱动:Vert.x Integration
- Vert.x Mail Client
- Vert.x STOMP Client & Server:提供了STOMP协议的实现包括客户端与服务端。
- Vert.x JCA Adaptor:提供了Java连接器架构适配器,这允许同任意JavaEE应用服务器进行互操作。
- Vert.x RabbitMQ Client
- Vert.x Kafka Client
- Vert.x Consul Client
</div>
<div id='right'>
5. 身份认证和授权
<div class="describe">
Vert.x提供了简单API用于在应用中提供认证和授权。包括:</br>
- Auth common:通用的认证API,可以通过重写AuthProvider类来实现自己的认证
- JDBC auth: 后台为JDBC的认证实现
- JWT auth: 用JSON Web tokens认证实现
- Shiro auth: 使用Apache Shiro认证实现
- MongoDB auth: MongoDB认证实现
- OAuth 2: Oauth2协义认证实现
- htdigest auth: 这个是新增一种认证的支持
</div>
</div>
协议支持
- TCP、UDP
- HTTP(包括HTTP/2)
- WebSocket
- Event Bus
- AMQP/RabbitMQ
- MQTT
集群支持
集群管理器:</br>
提供集群管理组件,可以实现节点发现、节点管理和消息传递等功能,让应用程序轻松实现水平扩展和负载均衡。组件支持包括hazelcast、Zookeeper、Redis等集群事件总线:</br>
支持全局发布/订阅系统,用于在集群中广播事件或消息。通过事件总线,Vert.x应用程序可以实现水平扩展,它可以将事件广播到集群中的所有节点共享数据:</br>
支持多个Vert.x实例共享数据,共享方式包括本地哈希、分布式哈希、异步数据库查询等集群之间的模块通信:</br>
支持使用EventBus实现进程间消息通信,以及支持集群中多个节点之间建立通信通道,是高效的跨进程通信机制。
核心概念
- Verticle </br>
Verticle是Vert.x中的部署单元,相当于应用中的一个服务。Verticle可以被传递一些配置信息(如证书、网络地址等),而且Verticle可以被多次部署,Verticle可以部署其它Verticle。</br>
<div class="describe">
Verticle分为三类:
Standard verticle</br>
Standard Verticle会被分派到一个event loop线程上</br>
该Standard Verticle里面注册的所有回调handler都会被这个event loop线程来调用</br>
Standard Verticle 会阻塞 event loop线程</br>Worker verticle</br>
会被workpool中的线程执行,vert.x会保证每次只有一个线程在执行。</br>
Worker verticle不会阻塞event loop线程。Multi-threaded worker verticles</br>
和普通的Worker verticle相比,区别在于,会在同一个时间点,有多个线程同时执行一个Worker Verticle实例
</div>
核心概念
-
EvenLoop </br>
EventLoop是异步编程模型中是特有的,一个Verticle通过一个EventLoop来处理接收到的事件,这些事件可以是任何事情,如接收网络缓冲、调度事件或由其它Verticle发送的消息,EventLoop中执行时,不能进行线程阻塞操作。
vertx-eventloop.png
核心概念
-
EvenBus </br>
事件总线(EvenBus)是在不同Verticle之间通过异步消息传递进行通讯的主要工具。</br>
支持三种消息机制:发布/订阅、点对点、请求/回应
vertx-eventbus.png
Vert.x是如何做到高性能的?
<div id="left">
采用异步编程模型
异步非阻塞,V4版本提高了promise、future,解决callback hell问题
事件总线机制,EventLoop和回调机制实现了非阻塞I/O操作
Event Bus 消息总线机制
</div>
<div id="right">
主从reactor模型
</div>
Note: netty的主从reactor模型
- Reactor 主线程 MainReactor 对象通过 select 监听连接事件, 收到事件后,通过 Acceptor 处理连接事件
- 当 Acceptor 处理连接事件后,MainReactor 将连接分配给 SubReactor
- subreactor 将连接加入到连接队列进行监听,并创建 handler 进行各种事件处理
- 当有新事件发生时, subreactor 就会调用对应的 handler 处理
- handler 通过 read 读取数据,分发给后面的 worker 线程处理
- worker 线程池分配独立的 worker 线程进行业务处理,并返回结果
- handler 收到响应的结果后,再通过 send 将结果返回给 client
- Reactor 主线程可以对应多个 Reactor 子线程, 即 MainRecator 可以关联多个 SubReactor
使用Vert.x搭建服务
搭建TCP服务
NetServer server = vertx.createNetServer();
server.listen(9000, "localhost", res -> {
if (res.succeeded()) {
System.out.println("Server is now listening!");
} else {
System.out.println("Failed to bind!");
}
});
搭建HTTP Web Server
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServer;
import io.vertx.core.http.HttpServerRequest;
public class HttpServerExample {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
HttpServer server = vertx.createHttpServer();
Router router = Router.router(vertx);
router.route().handler(routingContext -> {
// 所有的请求都会调用这个处理器处理
HttpServerResponse response = routingContext.response();
response.putHeader("content-type", "text/plain");
// 写入响应并结束处理
response.end("Hello World from Vert.x-Web!");
});
server.requestHandler(router::accept).listen(8080);
}
}
如何使用vert.x进行优雅的异步开发?
使用Vert.x + (Reactive Streams/RxJava) + SpringBoot 编写业务系统
使用Spring强大的依赖注入和配置管理等特性,解决模块之间的依赖、配置等问题
吞吐量能比SpringBoot + Tomcat的架构模式大 3 倍以上
事例
<div class="describe">
Vert.x + (Reactive Streams) + SpringBoot </br>
https://github.com/diegocamara/vertx-springboot-realworld-example-app使用Vert.x + RxJava3
https://github.com/tsegismont/vertx-musicstore
</div>
性能到底如何?
[图片来源于https://www.techempower.com/]
未来展望
- 归属Eclipse Foundation,版本一直在迭代升级中,性能和使用体验都在不断提高
- Vert.x未来将会在数据处理、分布式应用等方面做出更多的贡献
- 最近几年较火的Quarkus框架,是在Vert.x之上构建的,支持GraalVM,面向云原生,具备极快的启动时间和低内存消耗
参考资料
- 官方文档[https://vertx.io/get-started/]
- 书籍[vertx in action]
- 书籍[Netty In Action]
https://zhuanlan.zhihu.com/p/407323966