Vert.x 学习笔记

一、概述

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 学习笔记_第1张图片

 

别人的心得:

  • 最基础的用法:Standard的Verticle组件用于接收请求,Worker的Verticle组件用于阻塞任务(访问数据库、文件系统、网络)。
  • 如果是少量的阻塞任务,可以考虑使用内联的方式(vertx中的executeBlocking方法)替代Worker。
  • 对于前端拦截器和前端过滤器有几种做法:
    • 使用API Web Contract做基础数据验证和数据合约验证;
    • 通过Vertx Web做前端验证和前端过滤器(使用Router中的order参数);
    • 参考Zero中对JSR340的做法,自己开发基于Vert.x的过滤器/拦截器;
  • Worker中的方法一般是做阻塞任务,在发布过程,它和Standard类型的Verticle可以不对等(instances数量不对等);
  • 在Event Bus中传输数据时,必要的时候自己开发自定义的Codec来实现数据传输;
  • 如果在Standard中需要执行阻塞任务(如访问etcd配置中心、访问h2元数据服务器,需要将代码放到executeBlocking中,防止Event Loop阻塞);

注意事项:

在多数情况下,Vert.x使用被称为 Event Loop(线程安全的) 的线程来调用您的处理器。

由于Vert.x或应用程序的代码块中没有阻塞,Event Loop 可以在事件到达时快速地分发到不同的处理器中。

由于没有阻塞,Event Loop 可在短时间内分发大量的事件。例如,一个单独的 Event Loop 可以非常迅速地处理数千个 HTTP 请求。

所以,需要尽可能的去避免使用阻塞方法.

 Vert.x 学习笔记_第2张图片

 

每个事件应在合理的时间内进行处理,以免阻塞事件循环(EventLoop)。这意味着当在事件循环(EventLoop)中执行时,不能进行线程阻塞操作,类似在一个GUI中处理事件(如通过执行一个缓慢的网络请求可以冻结Java/Swing界面)。

Vert.x在事件循环(EventLoop)的外部提供了处理阻塞操作的机制。在任何情况下,事件循环(EventLoop)执行事件的时间过长时,Vert.x会在日志中输出警告,这是可配置的,以满足特定应用需求(如当工作于较慢的IoT ARM板时)。

Vert.x 的核心 Java API 被我们称为 Vert.x Core。

Vertx对象扮演着Vert.x控制中心的角色,同时它也提供了大量的功能,例如:

  • 编写 TCP 客户端和服务端
  • 编写支持 WebSocket 的 HTTP 客户端和服务端
  • 事件总线
  • 共享数据 —— 本地的Map和分布式集群Map
  • 周期性、延迟性动作
  • 部署和撤销 Verticle 实例
  • 数据报套接字
  • DNS客户端
  • 文件系统访问
  • 高可用性
  • 集群

                                     Vert.x生态系统的不完全概览

Vert.x 学习笔记_第3张图片

 

二、Vert.x是基于事件的

 

Verticle 种类

 

这儿有三种不同类型的 Verticle:

  • Stardand Verticle:这是最常用的一类 Verticle —— 它们永远运行在 Event Loop 线程上。
  • Worker Verticle:这类 Verticle 会运行在 Worker Pool 中的线程上。一个实例绝对不会被多个线程同时执行。
  • Multi-Threaded Worker Verticle:这类 Verticle 也会运行在 Worker Pool 中的线程上。一个实例可以由多个线程同时执行(译者注:因此需要开发者自己确保线程安全)。
     

Vert.x的执行单元叫verticle。即程序的入口,每个语言可能实现的方式不一样,比如Java需要继承一个AbstractVerticle抽象类

verticle分两种,一种是基于EventLoop的适合I/O密集型的,还有一种是适合CPU密集型的worker verticle。而verticle之间相互通信只能通过Eventbus,可以支持point to point 的通信,也可以支持publish & subscribe通信方式。

你可能感兴趣的:(vertx,java,开发语言,后端)