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全家桶的生态体系,具体如下:
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 | URL site = new URL("http://vertx.io/"); |
但是用 Vert.x 的话,就很简单:
1 | vertx.createHttpClient().getNow(80, "vertx.io", "", response -> { |
对于异步编程的理解,比如ajax与Vert.x
1 | //ajax代码 |
1 | //vert.x代码 |
学习资料
A gentle guide to asynchronous programming with Eclipse Vert.x for Java developers中文翻译版