Vert.x(http://vertx.io)是一个基于JVM、轻量级、高性能的应用平台,非常适用于最新的移动端后台、互联网、企业应用架构. Vert.x是基于大名鼎鼎netty的异步的工具集。可以简单理解成运行在JVM上的Node.js。拥有高性能的一个java框架,可以维持单服务器至少120万长连接的平台.
特性:
1、同时支持多种编程语言——目前已经支持了Java、Scala、JavaScript、Ruby、Python、Groovy、Clojure、Ceylon等。对程序员来说,直接好处就是可以使用各种语言丰富的LIB,同时也不再为编程语言选型而纠结;
2、异步无锁编程——经典的多线程编程模型能满足很多Web开发场景,但随着移动互联网并发连接数的猛增,多线程并发控制模型性能难以扩展,同时要想控制好并发锁需要较高的技巧,目前Reactor异步编程模型开始跑马圈地,而Vert.x就是这种异步无锁编程的一个首选;
3、对各种IO的丰富支持——目前Vert.x的异步模型已支持TCP、UDP、FileSystem、DNS、EventBus、Sockjs等;极好的分布式开发支持——Vert.x通过EventBus事件总线,可以轻松编写分布式解耦的程序,具有很好的扩展性;
4、生态体系日趋成熟——Vert.x归入Eclipse基金会门下,异步驱动已经支持了Postgres、MySQL、MongoDB、Redis等常用组件,并且有若干Vert.x在生产环境中的应用案例。
重要概念
Verticle
基于Vert.x框架实现的代码包,就是一个Verticle,简单点说,一个可以被Vert.x框架执行的代码调用了Vert.xAPI的代码就是一个Verticle.他可以用Scala Clojure JS Ruby等语言实现.多个Verticle实例可以并行的被执行.一个基于Vert.x的服务也许需要多个verticles来实现,而且要部署在多台服务器上.他们之间通过vert.x事件进行通信.你可以之间通过vert.x命令启动,也可以将verticle包装成vert.x modules.
Module
Vert.x应用由一个或多个modules来实现.一个模块呢由多个verticles来实现.你可以把module想象出一个个Java package.里面可能是特定业务的实现,或者公共的服务实现(那些可以重用的服务).Vert.x编写好的module,可以发布到maven的仓库里.以zip包装成二进制格式.或者发布到vert.x module 注册中心.实际上这种以模块方式的开发,支撑着整个Vert.x生态系统.Module更多的信息,我需要单独开一个系列来讲解.
Event Bus:
它是Vert.X的核心,在集群中容器之间的通信,各个Verticle之间的通讯都是经过Event Bus来实现的,后期会推出一篇专门关于这个的文章,敬请等待。
Shared Data:
它是Vert.X提供的一个简单共享Map和Set,用来解决各个Verticle之间的数据共享
框架图:
别人的心得:
注意事项:
在多数情况下,Vert.x使用被称为 Event Loop(线程安全的) 的线程来调用您的处理器。
由于Vert.x或应用程序的代码块中没有阻塞,Event Loop 可以在事件到达时快速地分发到不同的处理器中。
由于没有阻塞,Event Loop 可在短时间内分发大量的事件。例如,一个单独的 Event Loop 可以非常迅速地处理数千个 HTTP 请求。
所以,需要尽可能的去避免使用阻塞方法.
每个事件应在合理的时间内进行处理,以免阻塞事件循环(EventLoop)。这意味着当在事件循环(EventLoop)中执行时,不能进行线程阻塞操作,类似在一个GUI中处理事件(如通过执行一个缓慢的网络请求可以冻结Java/Swing界面)。
Vert.x在事件循环(EventLoop)的外部提供了处理阻塞操作的机制。在任何情况下,事件循环(EventLoop)执行事件的时间过长时,Vert.x会在日志中输出警告,这是可配置的,以满足特定应用需求(如当工作于较慢的IoT ARM板时)。
Vert.x 的核心 Java API 被我们称为 Vert.x Core。
Vertx对象扮演着Vert.x控制中心的角色,同时它也提供了大量的功能,例如:
Vert.x生态系统的不完全概览
这儿有三种不同类型的 Verticle:
Vert.x的执行单元叫verticle。即程序的入口,每个语言可能实现的方式不一样,比如Java需要继承一个AbstractVerticle抽象类
verticle分两种,一种是基于EventLoop的适合I/O密集型的,还有一种是适合CPU密集型的worker verticle。而verticle之间相互通信只能通过Eventbus,可以支持point to point 的通信,也可以支持publish & subscribe通信方式。