一、概述

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之间的数据共享

框架图:

别人的心得:

  • 最基础的用法: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 请求。

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

每个事件应在合理的时间内进行处理,以免阻塞事件循环(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是基于事件的

 

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通信方式。

Vert.x 学习笔记相关推荐

  1. Vert.x学习笔记(一) Vert.x 核心包

    Vert.x是一个事件驱动的JVM上的框架,可以帮助我们构建现代.灵活.可扩展的程序.Vert.x有多种语言的版本,可以用在Java.Kotlin.Scala.Groovy.Ruby等语言上.当然现在 ...

  2. 一文弄懂元学习 (Meta Learing)(附代码实战)《繁凡的深度学习笔记》第 15 章 元学习详解 (上)万字中文综述

    <繁凡的深度学习笔记>第 15 章 元学习详解 (上)万字中文综述(DL笔记整理系列) 3043331995@qq.com https://fanfansann.blog.csdn.net ...

  3. 深度学习(三十五)异构计算GLSL学习笔记(1)

    异构计算GLSL学习笔记(1) 原文地址:http://blog.csdn.net/hjimce/article/details/51475644 作者:hjimce 最近开始学习深度学习的一些gpu ...

  4. AI学习笔记(十二)物体检测(上)

    AI学习笔记之物体检测(上) 物体检测简介 常见检测网络 IOU TP.TN.FP.FN precision(精确度)和recall(召回率) 边框回归 边框回归具体方法 Selective Sear ...

  5. 《21天转型微服务实战营》 学习笔记

    <21天转型微服务实战营> 学习笔记 目录 <21天转型微服务实战营> 学习笔记 1 微服务架构知识介绍 1.1 什么是微服务 1.2 为什么使用微服务 1.3 微服务面临的挑 ...

  6. 四元数与旋转——学习笔记(一)

    联系方式:860122112@qq.com 四元数与旋转--学习笔记(一) 四元数与旋转--学习笔记(二) 四元数与旋转--学习笔记(三) 一.引言 三维空间里向量或坐标系之间的旋转关系可以用 3×3 ...

  7. PointNet学习笔记(一)—— 论文

    PointNet学习笔记(一)-- 论文 本文记录了博主在学习<PointNet: Deep Learning on Point Sets for 3D Clasification and Se ...

  8. Unity3D学习笔记6——GPU实例化(1)

    文章目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成 ...

  9. LearnOpenGL学习笔记—PBR:IBL

    LearnOpenGL学习笔记-PBR:IBL 0 引入 1 渲染方程的求解 2 hdr文件转成cubemap 3 预计算漫反射积分 4 预计算镜面反射积分 4.1 预滤波HDR环境贴图 4.1.1 ...

最新文章

  1. LOJ 2537 「PKUWC2018」Minimax
  2. 中国式姥姥上热搜感动无数人:有妈妈在,我才敢生娃
  3. 如果你要对一个变量进行反向传播,你必须保证其为Tensor
  4. APACHE工作原理详解
  5. Android性能优化 - 内存优化
  6. forum tribune
  7. 什么是元宇宙?为何要关注它?
  8. python音乐下载器-支持所有主流平台-python脚本源码下载
  9. 最新黑马程序员全套视频-.net视频,大家赶紧来下载吧,看图片水印上的QQ加我索取视频教程
  10. 在计算机上找不到autocad,天正提示找不到可用的AutoCAD版本怎么办?
  11. 本地编译 全志a33 的步骤
  12. 基于QT的IM(jabber)库和客户端
  13. 数据库监控 Prometheus + Grafana
  14. “有点笨”的数学大师迈克尔·弗里德曼
  15. linux 手机 rom image,安卓手机刷机界面image 文件夹什么意思 里面的文件都是什么作用...
  16. steam游戏存档迁移
  17. window global
  18. mac改变ipv4地址无法上网
  19. 测量RT-Thread线程调度的时间的方法
  20. ubuntu11.10 华为无线上网卡e303s

热门文章

  1. 虚拟机网络连接图标消失问题
  2. 宏转录组方法_8个样本发9分PNAS:宏转录组 PK 宏基因组
  3. 数据库、数据湖、数据仓库、湖仓一体、智能湖仓,分别都是什么鬼?
  4. Normalized Object Coordinate Space for Category-Level 6D Object Pose and Size Estimation学习笔记
  5. 为什么能持续成交,究竟是做对了什么?我想到了这些...
  6. input标签的value属性详解
  7. vlunhub-DC1|CSDN创作打卡
  8. 商业内幕:20家最具创新力的科技创业公司
  9. 详细SpringBoot教程之日志框架
  10. 并发编程系列---【线程池七大核心参数】